diff options
Diffstat (limited to 'subprojects')
23 files changed, 271 insertions, 854 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 | */ |
6 | package tools.refinery.language.ide.contentassist; | 6 | package tools.refinery.language.ide.contentassist; |
7 | 7 | ||
8 | import java.util.Objects; | 8 | import com.google.inject.Inject; |
9 | |||
10 | import org.eclipse.emf.ecore.EObject; | 9 | import org.eclipse.emf.ecore.EObject; |
11 | import org.eclipse.emf.ecore.util.EcoreUtil; | 10 | import org.eclipse.emf.ecore.util.EcoreUtil; |
12 | import org.eclipse.xtext.CrossReference; | 11 | import org.eclipse.xtext.CrossReference; |
13 | import org.eclipse.xtext.GrammarUtil; | 12 | import org.eclipse.xtext.GrammarUtil; |
14 | import org.eclipse.xtext.ide.editor.contentassist.ContentAssistContext; | 13 | import org.eclipse.xtext.ide.editor.contentassist.ContentAssistContext; |
15 | import org.eclipse.xtext.ide.editor.contentassist.ContentAssistEntry; | ||
16 | import org.eclipse.xtext.ide.editor.contentassist.IdeCrossrefProposalProvider; | 14 | import org.eclipse.xtext.ide.editor.contentassist.IdeCrossrefProposalProvider; |
15 | import org.eclipse.xtext.naming.QualifiedName; | ||
17 | import org.eclipse.xtext.nodemodel.util.NodeModelUtils; | 16 | import org.eclipse.xtext.nodemodel.util.NodeModelUtils; |
18 | import org.eclipse.xtext.resource.IEObjectDescription; | 17 | import org.eclipse.xtext.resource.IEObjectDescription; |
19 | 18 | import org.eclipse.xtext.scoping.IScope; | |
20 | import com.google.inject.Inject; | ||
21 | |||
22 | import tools.refinery.language.model.problem.Problem; | 19 | import tools.refinery.language.model.problem.Problem; |
20 | import tools.refinery.language.resource.ProblemResourceDescriptionStrategy; | ||
23 | import tools.refinery.language.resource.ReferenceCounter; | 21 | import tools.refinery.language.resource.ReferenceCounter; |
24 | import tools.refinery.language.utils.ProblemUtil; | 22 | import tools.refinery.language.utils.ProblemUtil; |
25 | 23 | ||
24 | import java.util.ArrayList; | ||
25 | import java.util.HashMap; | ||
26 | import java.util.List; | ||
27 | import java.util.Objects; | ||
28 | |||
26 | public class ProblemCrossrefProposalProvider extends IdeCrossrefProposalProvider { | 29 | public 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; | |||
16 | import org.eclipse.xtext.nodemodel.util.NodeModelUtils; | 16 | import org.eclipse.xtext.nodemodel.util.NodeModelUtils; |
17 | import org.eclipse.xtext.service.OperationCanceledManager; | 17 | import org.eclipse.xtext.service.OperationCanceledManager; |
18 | import org.eclipse.xtext.util.CancelIndicator; | 18 | import org.eclipse.xtext.util.CancelIndicator; |
19 | import org.jetbrains.annotations.NotNull; | ||
19 | import tools.refinery.language.model.problem.*; | 20 | import tools.refinery.language.model.problem.*; |
20 | import tools.refinery.language.utils.ProblemDesugarer; | 21 | import tools.refinery.language.utils.ProblemDesugarer; |
21 | import tools.refinery.language.utils.ProblemUtil; | 22 | import 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) { |
diff --git a/subprojects/language-model/problem.aird b/subprojects/language-model/problem.aird index 286dabd6..a307ae83 100644 --- a/subprojects/language-model/problem.aird +++ b/subprojects/language-model/problem.aird | |||
@@ -7,7 +7,7 @@ | |||
7 | <semanticResources>build/resources/main/model/problem.genmodel</semanticResources> | 7 | <semanticResources>build/resources/main/model/problem.genmodel</semanticResources> |
8 | <ownedViews xmi:type="viewpoint:DView" uid="_CsAAYKA4EeuqkpDnuik1sg"> | 8 | <ownedViews xmi:type="viewpoint:DView" uid="_CsAAYKA4EeuqkpDnuik1sg"> |
9 | <viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']"/> | 9 | <viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']"/> |
10 | <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_CsYa4KA4EeuqkpDnuik1sg" name="declarations" repPath="#_CsUwgKA4EeuqkpDnuik1sg" changeId="f104e460-dce9-4947-b526-467cf8618336"> | 10 | <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_CsYa4KA4EeuqkpDnuik1sg" name="declarations" repPath="#_CsUwgKA4EeuqkpDnuik1sg" changeId="7fa3b02a-a620-4e42-87d5-b2cc35ee8070"> |
11 | <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/> | 11 | <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/> |
12 | <target xmi:type="ecore:EPackage" href="src/main/resources/model/problem.ecore#/"/> | 12 | <target xmi:type="ecore:EPackage" href="src/main/resources/model/problem.ecore#/"/> |
13 | </ownedRepresentationDescriptors> | 13 | </ownedRepresentationDescriptors> |
@@ -79,9 +79,9 @@ | |||
79 | <children xmi:type="notation:Node" xmi:id="_fit3kKA5EeuqkpDnuik1sg" type="2003" element="_fihqUKA5EeuqkpDnuik1sg"> | 79 | <children xmi:type="notation:Node" xmi:id="_fit3kKA5EeuqkpDnuik1sg" type="2003" element="_fihqUKA5EeuqkpDnuik1sg"> |
80 | <children xmi:type="notation:Node" xmi:id="_fit3k6A5EeuqkpDnuik1sg" type="5007"/> | 80 | <children xmi:type="notation:Node" xmi:id="_fit3k6A5EeuqkpDnuik1sg" type="5007"/> |
81 | <children xmi:type="notation:Node" xmi:id="_fit3lKA5EeuqkpDnuik1sg" type="7004"> | 81 | <children xmi:type="notation:Node" xmi:id="_fit3lKA5EeuqkpDnuik1sg" type="7004"> |
82 | <children xmi:type="notation:Node" xmi:id="_id6DcDNoEe2fD4dIhR_vzA" type="3010" element="_ida7QDNoEe2fD4dIhR_vzA"> | 82 | <children xmi:type="notation:Node" xmi:id="_bmoagDrQEe62Q_vL_UTCsA" type="3010" element="_blvCoDrQEe62Q_vL_UTCsA"> |
83 | <styles xmi:type="notation:FontStyle" xmi:id="_id6DcTNoEe2fD4dIhR_vzA" fontColor="2697711" fontName="Noto Sans" fontHeight="8"/> | 83 | <styles xmi:type="notation:FontStyle" xmi:id="_bmoagTrQEe62Q_vL_UTCsA" fontColor="2697711" fontName="Noto Sans" fontHeight="8"/> |
84 | <layoutConstraint xmi:type="notation:Location" xmi:id="_id6DcjNoEe2fD4dIhR_vzA"/> | 84 | <layoutConstraint xmi:type="notation:Location" xmi:id="_bmoagjrQEe62Q_vL_UTCsA"/> |
85 | </children> | 85 | </children> |
86 | <styles xmi:type="notation:SortingStyle" xmi:id="_fit3laA5EeuqkpDnuik1sg"/> | 86 | <styles xmi:type="notation:SortingStyle" xmi:id="_fit3laA5EeuqkpDnuik1sg"/> |
87 | <styles xmi:type="notation:FilteringStyle" xmi:id="_fit3lqA5EeuqkpDnuik1sg"/> | 87 | <styles xmi:type="notation:FilteringStyle" xmi:id="_fit3lqA5EeuqkpDnuik1sg"/> |
@@ -92,10 +92,6 @@ | |||
92 | <children xmi:type="notation:Node" xmi:id="_QKLK0KA6EeuqkpDnuik1sg" type="2003" element="_QKD2EKA6EeuqkpDnuik1sg"> | 92 | <children xmi:type="notation:Node" xmi:id="_QKLK0KA6EeuqkpDnuik1sg" type="2003" element="_QKD2EKA6EeuqkpDnuik1sg"> |
93 | <children xmi:type="notation:Node" xmi:id="_QKLK06A6EeuqkpDnuik1sg" type="5007"/> | 93 | <children xmi:type="notation:Node" xmi:id="_QKLK06A6EeuqkpDnuik1sg" type="5007"/> |
94 | <children xmi:type="notation:Node" xmi:id="_QKLK1KA6EeuqkpDnuik1sg" type="7004"> | 94 | <children xmi:type="notation:Node" xmi:id="_QKLK1KA6EeuqkpDnuik1sg" type="7004"> |
95 | <children xmi:type="notation:Node" xmi:id="_ARsFYBjHEe2_erjsEmF9GQ" type="3010" element="_ARaYkBjHEe2_erjsEmF9GQ"> | ||
96 | <styles xmi:type="notation:FontStyle" xmi:id="_ARsFYRjHEe2_erjsEmF9GQ" fontColor="2697711" fontName="Noto Sans" fontHeight="8"/> | ||
97 | <layoutConstraint xmi:type="notation:Location" xmi:id="_ARsFYhjHEe2_erjsEmF9GQ"/> | ||
98 | </children> | ||
99 | <styles xmi:type="notation:SortingStyle" xmi:id="_QKLK1aA6EeuqkpDnuik1sg"/> | 95 | <styles xmi:type="notation:SortingStyle" xmi:id="_QKLK1aA6EeuqkpDnuik1sg"/> |
100 | <styles xmi:type="notation:FilteringStyle" xmi:id="_QKLK1qA6EeuqkpDnuik1sg"/> | 96 | <styles xmi:type="notation:FilteringStyle" xmi:id="_QKLK1qA6EeuqkpDnuik1sg"/> |
101 | </children> | 97 | </children> |
@@ -308,31 +304,6 @@ | |||
308 | <styles xmi:type="notation:ShapeStyle" xmi:id="_xp1icTNlEe2fD4dIhR_vzA" fontName="Noto Sans" fontHeight="8"/> | 304 | <styles xmi:type="notation:ShapeStyle" xmi:id="_xp1icTNlEe2fD4dIhR_vzA" fontName="Noto Sans" fontHeight="8"/> |
309 | <layoutConstraint xmi:type="notation:Bounds" xmi:id="_xp1icjNlEe2fD4dIhR_vzA" x="574" y="1280" width="120" height="100"/> | 305 | <layoutConstraint xmi:type="notation:Bounds" xmi:id="_xp1icjNlEe2fD4dIhR_vzA" x="574" y="1280" width="120" height="100"/> |
310 | </children> | 306 | </children> |
311 | <children xmi:type="notation:Node" xmi:id="_DFHboDNoEe2fD4dIhR_vzA" type="2003" element="_DD1pQDNoEe2fD4dIhR_vzA"> | ||
312 | <children xmi:type="notation:Node" xmi:id="_DFICsDNoEe2fD4dIhR_vzA" type="5007"/> | ||
313 | <children xmi:type="notation:Node" xmi:id="_DFICsTNoEe2fD4dIhR_vzA" type="7004"> | ||
314 | <children xmi:type="notation:Node" xmi:id="_FDz88DNoEe2fD4dIhR_vzA" type="3010" element="_FDOuIDNoEe2fD4dIhR_vzA"> | ||
315 | <styles xmi:type="notation:FontStyle" xmi:id="_FDz88TNoEe2fD4dIhR_vzA" fontName="Noto Sans" fontHeight="8"/> | ||
316 | <layoutConstraint xmi:type="notation:Location" xmi:id="_FDz88jNoEe2fD4dIhR_vzA"/> | ||
317 | </children> | ||
318 | <children xmi:type="notation:Node" xmi:id="_F3CwsDNoEe2fD4dIhR_vzA" type="3010" element="_F2glMDNoEe2fD4dIhR_vzA"> | ||
319 | <styles xmi:type="notation:FontStyle" xmi:id="_F3CwsTNoEe2fD4dIhR_vzA" fontName="Noto Sans" fontHeight="8"/> | ||
320 | <layoutConstraint xmi:type="notation:Location" xmi:id="_F3CwsjNoEe2fD4dIhR_vzA"/> | ||
321 | </children> | ||
322 | <children xmi:type="notation:Node" xmi:id="_GTcY0DNoEe2fD4dIhR_vzA" type="3010" element="_GS7bcDNoEe2fD4dIhR_vzA"> | ||
323 | <styles xmi:type="notation:FontStyle" xmi:id="_GTcY0TNoEe2fD4dIhR_vzA" fontName="Noto Sans" fontHeight="8"/> | ||
324 | <layoutConstraint xmi:type="notation:Location" xmi:id="_GTcY0jNoEe2fD4dIhR_vzA"/> | ||
325 | </children> | ||
326 | <children xmi:type="notation:Node" xmi:id="_GyKVIDNoEe2fD4dIhR_vzA" type="3010" element="_Gx7EkDNoEe2fD4dIhR_vzA"> | ||
327 | <styles xmi:type="notation:FontStyle" xmi:id="_GyKVITNoEe2fD4dIhR_vzA" fontName="Noto Sans" fontHeight="8"/> | ||
328 | <layoutConstraint xmi:type="notation:Location" xmi:id="_GyKVIjNoEe2fD4dIhR_vzA"/> | ||
329 | </children> | ||
330 | <styles xmi:type="notation:SortingStyle" xmi:id="_DFICsjNoEe2fD4dIhR_vzA"/> | ||
331 | <styles xmi:type="notation:FilteringStyle" xmi:id="_DFICszNoEe2fD4dIhR_vzA"/> | ||
332 | </children> | ||
333 | <styles xmi:type="notation:ShapeStyle" xmi:id="_DFHboTNoEe2fD4dIhR_vzA" fontName="Noto Sans" fontHeight="8"/> | ||
334 | <layoutConstraint xmi:type="notation:Bounds" xmi:id="_DFHbojNoEe2fD4dIhR_vzA" x="1355" y="1280" width="120" height="100"/> | ||
335 | </children> | ||
336 | <children xmi:type="notation:Node" xmi:id="_782skF9mEe2rXNsIDUvqhw" type="2003" element="_78pRMF9mEe2rXNsIDUvqhw"> | 307 | <children xmi:type="notation:Node" xmi:id="_782skF9mEe2rXNsIDUvqhw" type="2003" element="_78pRMF9mEe2rXNsIDUvqhw"> |
337 | <children xmi:type="notation:Node" xmi:id="_783ToF9mEe2rXNsIDUvqhw" type="5007"/> | 308 | <children xmi:type="notation:Node" xmi:id="_783ToF9mEe2rXNsIDUvqhw" type="5007"/> |
338 | <children xmi:type="notation:Node" xmi:id="_783ToV9mEe2rXNsIDUvqhw" type="7004"> | 309 | <children xmi:type="notation:Node" xmi:id="_783ToV9mEe2rXNsIDUvqhw" type="7004"> |
@@ -1184,17 +1155,17 @@ | |||
1184 | </edges> | 1155 | </edges> |
1185 | <edges xmi:type="notation:Edge" xmi:id="_Nr78MGTzEe2qdtyPWAtoxA" type="4001" element="_NrtSzmTzEe2qdtyPWAtoxA" source="_c-HCQKA4EeuqkpDnuik1sg" target="_dzfLYGTvEe2qdtyPWAtoxA"> | 1156 | <edges xmi:type="notation:Edge" xmi:id="_Nr78MGTzEe2qdtyPWAtoxA" type="4001" element="_NrtSzmTzEe2qdtyPWAtoxA" source="_c-HCQKA4EeuqkpDnuik1sg" target="_dzfLYGTvEe2qdtyPWAtoxA"> |
1186 | <children xmi:type="notation:Node" xmi:id="_Nr78NGTzEe2qdtyPWAtoxA" type="6001"> | 1157 | <children xmi:type="notation:Node" xmi:id="_Nr78NGTzEe2qdtyPWAtoxA" type="6001"> |
1187 | <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Nr78NWTzEe2qdtyPWAtoxA" x="81"/> | 1158 | <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Nr78NWTzEe2qdtyPWAtoxA" x="79"/> |
1188 | </children> | 1159 | </children> |
1189 | <children xmi:type="notation:Node" xmi:id="_Nr78NmTzEe2qdtyPWAtoxA" type="6002"> | 1160 | <children xmi:type="notation:Node" xmi:id="_Nr78NmTzEe2qdtyPWAtoxA" type="6002"> |
1190 | <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Nr78N2TzEe2qdtyPWAtoxA" x="196" y="10"/> | 1161 | <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Nr78N2TzEe2qdtyPWAtoxA" x="193" y="10"/> |
1191 | </children> | 1162 | </children> |
1192 | <children xmi:type="notation:Node" xmi:id="_Nr78OGTzEe2qdtyPWAtoxA" type="6003"> | 1163 | <children xmi:type="notation:Node" xmi:id="_Nr78OGTzEe2qdtyPWAtoxA" type="6003"> |
1193 | <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Nr78OWTzEe2qdtyPWAtoxA" x="20" y="10"/> | 1164 | <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Nr78OWTzEe2qdtyPWAtoxA" x="19" y="10"/> |
1194 | </children> | 1165 | </children> |
1195 | <styles xmi:type="notation:ConnectorStyle" xmi:id="_Nr78MWTzEe2qdtyPWAtoxA" routing="Rectilinear"/> | 1166 | <styles xmi:type="notation:ConnectorStyle" xmi:id="_Nr78MWTzEe2qdtyPWAtoxA" routing="Rectilinear"/> |
1196 | <styles xmi:type="notation:FontStyle" xmi:id="_Nr78MmTzEe2qdtyPWAtoxA" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/> | 1167 | <styles xmi:type="notation:FontStyle" xmi:id="_Nr78MmTzEe2qdtyPWAtoxA" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/> |
1197 | <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Nr78M2TzEe2qdtyPWAtoxA" points="[-60, 24, 24, 526]$[-84, 24, 0, 526]$[-84, -502, 0, 0]"/> | 1168 | <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Nr78M2TzEe2qdtyPWAtoxA" points="[-60, 24, 24, 526]$[-80, 24, 4, 526]$[-80, -502, 4, 0]"/> |
1198 | <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Nr78OmTzEe2qdtyPWAtoxA" id="(0.41379310344827586,0.0)"/> | 1169 | <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Nr78OmTzEe2qdtyPWAtoxA" id="(0.41379310344827586,0.0)"/> |
1199 | <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Nr78O2TzEe2qdtyPWAtoxA" id="(0.3305084745762712,1.0)"/> | 1170 | <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Nr78O2TzEe2qdtyPWAtoxA" id="(0.3305084745762712,1.0)"/> |
1200 | </edges> | 1171 | </edges> |
@@ -1272,7 +1243,7 @@ | |||
1272 | </children> | 1243 | </children> |
1273 | <styles xmi:type="notation:ConnectorStyle" xmi:id="_WnX2AWg8Ee25oofngfVl_A" routing="Tree"/> | 1244 | <styles xmi:type="notation:ConnectorStyle" xmi:id="_WnX2AWg8Ee25oofngfVl_A" routing="Tree"/> |
1274 | <styles xmi:type="notation:FontStyle" xmi:id="_WnX2Amg8Ee25oofngfVl_A" fontName="Noto Sans" fontHeight="8"/> | 1245 | <styles xmi:type="notation:FontStyle" xmi:id="_WnX2Amg8Ee25oofngfVl_A" fontName="Noto Sans" fontHeight="8"/> |
1275 | <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_WnX2A2g8Ee25oofngfVl_A" points="[0, -56, 86, 383]$[0, -320, 86, 119]$[-85, -320, 1, 119]$[-85, -390, 1, 49]"/> | 1246 | <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_WnX2A2g8Ee25oofngfVl_A" points="[0, -56, 44, 383]$[0, -316, 44, 123]$[-43, -316, 1, 123]$[-43, -390, 1, 49]"/> |
1276 | <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_WnZEIGg8Ee25oofngfVl_A" id="(0.22950819672131148,0.5714285714285714)"/> | 1247 | <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_WnZEIGg8Ee25oofngfVl_A" id="(0.22950819672131148,0.5714285714285714)"/> |
1277 | <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_WnZEIWg8Ee25oofngfVl_A" id="(0.5,0.5)"/> | 1248 | <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_WnZEIWg8Ee25oofngfVl_A" id="(0.5,0.5)"/> |
1278 | </edges> | 1249 | </edges> |
@@ -1324,6 +1295,22 @@ | |||
1324 | <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mDflxmg8Ee25oofngfVl_A" id="(0.3644067796610169,0.16326530612244897)"/> | 1295 | <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mDflxmg8Ee25oofngfVl_A" id="(0.3644067796610169,0.16326530612244897)"/> |
1325 | <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mDflx2g8Ee25oofngfVl_A" id="(0.5,0.5)"/> | 1296 | <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mDflx2g8Ee25oofngfVl_A" id="(0.5,0.5)"/> |
1326 | </edges> | 1297 | </edges> |
1298 | <edges xmi:type="notation:Edge" xmi:id="_8s7BwDrXEe62Q_vL_UTCsA" type="4001" element="_8sdu2DrXEe62Q_vL_UTCsA" source="_c-HCQKA4EeuqkpDnuik1sg" target="_dzfLYGTvEe2qdtyPWAtoxA"> | ||
1299 | <children xmi:type="notation:Node" xmi:id="_8s-sIDrXEe62Q_vL_UTCsA" type="6001"> | ||
1300 | <layoutConstraint xmi:type="notation:Bounds" xmi:id="_8s-sITrXEe62Q_vL_UTCsA" x="-155" y="-60"/> | ||
1301 | </children> | ||
1302 | <children xmi:type="notation:Node" xmi:id="_8s-sIjrXEe62Q_vL_UTCsA" type="6002"> | ||
1303 | <layoutConstraint xmi:type="notation:Bounds" xmi:id="_8s-sIzrXEe62Q_vL_UTCsA" x="69" y="10"/> | ||
1304 | </children> | ||
1305 | <children xmi:type="notation:Node" xmi:id="_8s-sJDrXEe62Q_vL_UTCsA" type="6003"> | ||
1306 | <layoutConstraint xmi:type="notation:Bounds" xmi:id="_8s-sJTrXEe62Q_vL_UTCsA" x="3" y="10"/> | ||
1307 | </children> | ||
1308 | <styles xmi:type="notation:ConnectorStyle" xmi:id="_8s7BwTrXEe62Q_vL_UTCsA" routing="Rectilinear"/> | ||
1309 | <styles xmi:type="notation:FontStyle" xmi:id="_8s7BwjrXEe62Q_vL_UTCsA" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/> | ||
1310 | <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_8s7BwzrXEe62Q_vL_UTCsA" points="[-52, 40, 0, 542]$[-84, 40, -32, 542]$[-84, -502, -32, 0]"/> | ||
1311 | <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_8s_6QDrXEe62Q_vL_UTCsA" id="(0.3586206896551724,0.0)"/> | ||
1312 | <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_8s_6QTrXEe62Q_vL_UTCsA" id="(0.5338983050847458,1.0)"/> | ||
1313 | </edges> | ||
1327 | </data> | 1314 | </data> |
1328 | </ownedAnnotationEntries> | 1315 | </ownedAnnotationEntries> |
1329 | <ownedAnnotationEntries xmi:type="description:AnnotationEntry" uid="_Csiy8KA4EeuqkpDnuik1sg" source="DANNOTATION_CUSTOMIZATION_KEY"> | 1316 | <ownedAnnotationEntries xmi:type="description:AnnotationEntry" uid="_Csiy8KA4EeuqkpDnuik1sg" source="DANNOTATION_CUSTOMIZATION_KEY"> |
@@ -1369,7 +1356,7 @@ | |||
1369 | <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/> | 1356 | <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/> |
1370 | </ownedElements> | 1357 | </ownedElements> |
1371 | </ownedDiagramElements> | 1358 | </ownedDiagramElements> |
1372 | <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_c-A7oKA4EeuqkpDnuik1sg" name="ReferenceDeclaration" tooltipText="" outgoingEdges="_0V3L1qA4EeuqkpDnuik1sg _p1JWcqBJEeuqkpDnuik1sg _NrtSzmTzEe2qdtyPWAtoxA _bNXJs2g8Ee25oofngfVl_A" incomingEdges="_0V3L1qA4EeuqkpDnuik1sg" width="12" height="10"> | 1359 | <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_c-A7oKA4EeuqkpDnuik1sg" name="ReferenceDeclaration" tooltipText="" outgoingEdges="_0V3L1qA4EeuqkpDnuik1sg _p1JWcqBJEeuqkpDnuik1sg _NrtSzmTzEe2qdtyPWAtoxA _bNXJs2g8Ee25oofngfVl_A _8sdu2DrXEe62Q_vL_UTCsA" incomingEdges="_0V3L1qA4EeuqkpDnuik1sg" width="12" height="10"> |
1373 | <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//ReferenceDeclaration"/> | 1360 | <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//ReferenceDeclaration"/> |
1374 | <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//ReferenceDeclaration"/> | 1361 | <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//ReferenceDeclaration"/> |
1375 | <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> | 1362 | <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> |
@@ -1441,14 +1428,14 @@ | |||
1441 | <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> | 1428 | <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> |
1442 | <arrangeConstraints>KEEP_SIZE</arrangeConstraints> | 1429 | <arrangeConstraints>KEEP_SIZE</arrangeConstraints> |
1443 | <arrangeConstraints>KEEP_RATIO</arrangeConstraints> | 1430 | <arrangeConstraints>KEEP_RATIO</arrangeConstraints> |
1444 | <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_jX0uAjNoEe2fD4dIhR_vzA" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216"> | 1431 | <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_dFvc0DrQEe62Q_vL_UTCsA" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216"> |
1445 | <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/> | 1432 | <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/> |
1446 | </ownedStyle> | 1433 | </ownedStyle> |
1447 | <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/> | 1434 | <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/> |
1448 | <ownedElements xmi:type="diagram:DNodeListElement" uid="_ida7QDNoEe2fD4dIhR_vzA" name="kind : PredicateKind = DEFAULT" tooltipText=""> | 1435 | <ownedElements xmi:type="diagram:DNodeListElement" uid="_blvCoDrQEe62Q_vL_UTCsA" name="error : EBoolean = false" tooltipText=""> |
1449 | <target xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//PredicateDefinition/kind"/> | 1436 | <target xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//PredicateDefinition/error"/> |
1450 | <semanticElements xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//PredicateDefinition/kind"/> | 1437 | <semanticElements xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//PredicateDefinition/error"/> |
1451 | <ownedStyle xmi:type="diagram:BundledImage" uid="_jX18JDNoEe2fD4dIhR_vzA" labelAlignment="LEFT"> | 1438 | <ownedStyle xmi:type="diagram:BundledImage" uid="_dFx5EzrQEe62Q_vL_UTCsA" labelAlignment="LEFT"> |
1452 | <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']/@style"/> | 1439 | <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']/@style"/> |
1453 | </ownedStyle> | 1440 | </ownedStyle> |
1454 | <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/> | 1441 | <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/> |
@@ -1464,14 +1451,6 @@ | |||
1464 | <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/> | 1451 | <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/> |
1465 | </ownedStyle> | 1452 | </ownedStyle> |
1466 | <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/> | 1453 | <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/> |
1467 | <ownedElements xmi:type="diagram:DNodeListElement" uid="_ARaYkBjHEe2_erjsEmF9GQ" name="modality : Modality = DEFAULT" tooltipText=""> | ||
1468 | <target xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//Parameter/modality"/> | ||
1469 | <semanticElements xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//Parameter/modality"/> | ||
1470 | <ownedStyle xmi:type="diagram:BundledImage" uid="_CsAyxRjHEe2_erjsEmF9GQ" labelAlignment="LEFT"> | ||
1471 | <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']/@style"/> | ||
1472 | </ownedStyle> | ||
1473 | <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/> | ||
1474 | </ownedElements> | ||
1475 | </ownedDiagramElements> | 1454 | </ownedDiagramElements> |
1476 | <ownedDiagramElements xmi:type="diagram:DEdge" uid="_Uy4bWaA6EeuqkpDnuik1sg" name="[0..*] parameters" sourceNode="_A8hIkCrZEeyyC-O0_LlY9w" targetNode="_QKD2EKA6EeuqkpDnuik1sg"> | 1455 | <ownedDiagramElements xmi:type="diagram:DEdge" uid="_Uy4bWaA6EeuqkpDnuik1sg" name="[0..*] parameters" sourceNode="_A8hIkCrZEeyyC-O0_LlY9w" targetNode="_QKD2EKA6EeuqkpDnuik1sg"> |
1477 | <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//ParametricDefinition/parameters"/> | 1456 | <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//ParametricDefinition/parameters"/> |
@@ -1940,12 +1919,12 @@ | |||
1940 | <ownedDiagramElements xmi:type="diagram:DEdge" uid="_ddmjcCrZEeyyC-O0_LlY9w" sourceNode="_fihqUKA5EeuqkpDnuik1sg" targetNode="_A8hIkCrZEeyyC-O0_LlY9w"> | 1919 | <ownedDiagramElements xmi:type="diagram:DEdge" uid="_ddmjcCrZEeyyC-O0_LlY9w" sourceNode="_fihqUKA5EeuqkpDnuik1sg" targetNode="_A8hIkCrZEeyyC-O0_LlY9w"> |
1941 | <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//PredicateDefinition"/> | 1920 | <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//PredicateDefinition"/> |
1942 | <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//PredicateDefinition"/> | 1921 | <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//PredicateDefinition"/> |
1943 | <ownedStyle xmi:type="diagram:EdgeStyle" uid="_jX7b1DNoEe2fD4dIhR_vzA" lineStyle="dash" targetArrow="InputClosedArrow" routingStyle="tree"> | 1922 | <ownedStyle xmi:type="diagram:EdgeStyle" uid="_dF7qIjrQEe62Q_vL_UTCsA" lineStyle="dash" targetArrow="InputClosedArrow" routingStyle="tree"> |
1944 | <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@conditionnalStyles.0/@style"/> | 1923 | <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@conditionnalStyles.0/@style"/> |
1945 | <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_jX7b1TNoEe2fD4dIhR_vzA" showIcon="false"> | 1924 | <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_dF7qIzrQEe62Q_vL_UTCsA" showIcon="false"> |
1946 | <labelFormat>italic</labelFormat> | 1925 | <labelFormat>italic</labelFormat> |
1947 | </beginLabelStyle> | 1926 | </beginLabelStyle> |
1948 | <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_jX7b1jNoEe2fD4dIhR_vzA" showIcon="false"/> | 1927 | <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_dF7qJDrQEe62Q_vL_UTCsA" showIcon="false"/> |
1949 | </ownedStyle> | 1928 | </ownedStyle> |
1950 | <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/> | 1929 | <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/> |
1951 | </ownedDiagramElements> | 1930 | </ownedDiagramElements> |
@@ -2100,49 +2079,6 @@ | |||
2100 | <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/> | 2079 | <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/> |
2101 | </ownedElements> | 2080 | </ownedElements> |
2102 | </ownedDiagramElements> | 2081 | </ownedDiagramElements> |
2103 | <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_DD1pQDNoEe2fD4dIhR_vzA" name="PredicateKind" tooltipText="" width="12" height="10"> | ||
2104 | <target xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//PredicateKind"/> | ||
2105 | <semanticElements xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//PredicateKind"/> | ||
2106 | <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> | ||
2107 | <arrangeConstraints>KEEP_SIZE</arrangeConstraints> | ||
2108 | <arrangeConstraints>KEEP_RATIO</arrangeConstraints> | ||
2109 | <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_DD1pQTNoEe2fD4dIhR_vzA" borderSize="1" borderSizeComputationExpression="1" borderColor="125,125,125" backgroundStyle="Liquid" foregroundColor="221,236,202"> | ||
2110 | <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@style"/> | ||
2111 | </ownedStyle> | ||
2112 | <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']"/> | ||
2113 | <ownedElements xmi:type="diagram:DNodeListElement" uid="_FDOuIDNoEe2fD4dIhR_vzA" name="DEFAULT" tooltipText=""> | ||
2114 | <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//PredicateKind/DEFAULT"/> | ||
2115 | <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//PredicateKind/DEFAULT"/> | ||
2116 | <ownedStyle xmi:type="diagram:BundledImage" uid="_FDPVMDNoEe2fD4dIhR_vzA" labelAlignment="LEFT"> | ||
2117 | <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/> | ||
2118 | </ownedStyle> | ||
2119 | <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/> | ||
2120 | </ownedElements> | ||
2121 | <ownedElements xmi:type="diagram:DNodeListElement" uid="_F2glMDNoEe2fD4dIhR_vzA" name="ERROR" tooltipText=""> | ||
2122 | <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//PredicateKind/ERROR"/> | ||
2123 | <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//PredicateKind/ERROR"/> | ||
2124 | <ownedStyle xmi:type="diagram:BundledImage" uid="_F2hMQDNoEe2fD4dIhR_vzA" labelAlignment="LEFT"> | ||
2125 | <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/> | ||
2126 | </ownedStyle> | ||
2127 | <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/> | ||
2128 | </ownedElements> | ||
2129 | <ownedElements xmi:type="diagram:DNodeListElement" uid="_GS7bcDNoEe2fD4dIhR_vzA" name="CONTAINED" tooltipText=""> | ||
2130 | <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//PredicateKind/CONTAINED"/> | ||
2131 | <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//PredicateKind/CONTAINED"/> | ||
2132 | <ownedStyle xmi:type="diagram:BundledImage" uid="_GS7bcTNoEe2fD4dIhR_vzA" labelAlignment="LEFT"> | ||
2133 | <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/> | ||
2134 | </ownedStyle> | ||
2135 | <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/> | ||
2136 | </ownedElements> | ||
2137 | <ownedElements xmi:type="diagram:DNodeListElement" uid="_Gx7EkDNoEe2fD4dIhR_vzA" name="CONTAINMENT" tooltipText=""> | ||
2138 | <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//PredicateKind/CONTAINMENT"/> | ||
2139 | <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//PredicateKind/CONTAINMENT"/> | ||
2140 | <ownedStyle xmi:type="diagram:BundledImage" uid="_Gx7roDNoEe2fD4dIhR_vzA" labelAlignment="LEFT"> | ||
2141 | <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/> | ||
2142 | </ownedStyle> | ||
2143 | <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/> | ||
2144 | </ownedElements> | ||
2145 | </ownedDiagramElements> | ||
2146 | <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_78pRMF9mEe2rXNsIDUvqhw" name="FunctionDefinition" tooltipText="" outgoingEdges="_rKoQHF9nEe2rXNsIDUvqhw _S6YCJl9wEe2rXNsIDUvqhw _sMPaBmTvEe2qdtyPWAtoxA" width="12" height="10"> | 2082 | <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_78pRMF9mEe2rXNsIDUvqhw" name="FunctionDefinition" tooltipText="" outgoingEdges="_rKoQHF9nEe2rXNsIDUvqhw _S6YCJl9wEe2rXNsIDUvqhw _sMPaBmTvEe2qdtyPWAtoxA" width="12" height="10"> |
2147 | <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//FunctionDefinition"/> | 2083 | <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//FunctionDefinition"/> |
2148 | <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//FunctionDefinition"/> | 2084 | <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//FunctionDefinition"/> |
@@ -2349,7 +2285,7 @@ | |||
2349 | </ownedStyle> | 2285 | </ownedStyle> |
2350 | <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/> | 2286 | <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/> |
2351 | </ownedDiagramElements> | 2287 | </ownedDiagramElements> |
2352 | <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_dzVaYGTvEe2qdtyPWAtoxA" name="Relation" tooltipText="" outgoingEdges="_-OYJtGTvEe2qdtyPWAtoxA" incomingEdges="_m2GbcmTvEe2qdtyPWAtoxA _nxr57GTvEe2qdtyPWAtoxA _pHlWJ2TvEe2qdtyPWAtoxA _p-1uSmTvEe2qdtyPWAtoxA _sMPaBmTvEe2qdtyPWAtoxA _NrtSzmTzEe2qdtyPWAtoxA _YWqZhmTzEe2qdtyPWAtoxA _iWzpAmTzEe2qdtyPWAtoxA _q604amTzEe2qdtyPWAtoxA" width="12" height="10"> | 2288 | <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_dzVaYGTvEe2qdtyPWAtoxA" name="Relation" tooltipText="" outgoingEdges="_-OYJtGTvEe2qdtyPWAtoxA" incomingEdges="_m2GbcmTvEe2qdtyPWAtoxA _nxr57GTvEe2qdtyPWAtoxA _pHlWJ2TvEe2qdtyPWAtoxA _p-1uSmTvEe2qdtyPWAtoxA _sMPaBmTvEe2qdtyPWAtoxA _NrtSzmTzEe2qdtyPWAtoxA _YWqZhmTzEe2qdtyPWAtoxA _iWzpAmTzEe2qdtyPWAtoxA _q604amTzEe2qdtyPWAtoxA _8sdu2DrXEe62Q_vL_UTCsA" width="12" height="10"> |
2353 | <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Relation"/> | 2289 | <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Relation"/> |
2354 | <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Relation"/> | 2290 | <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Relation"/> |
2355 | <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> | 2291 | <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> |
@@ -2400,12 +2336,12 @@ | |||
2400 | <ownedDiagramElements xmi:type="diagram:DEdge" uid="_p-1uSmTvEe2qdtyPWAtoxA" sourceNode="_fihqUKA5EeuqkpDnuik1sg" targetNode="_dzVaYGTvEe2qdtyPWAtoxA"> | 2336 | <ownedDiagramElements xmi:type="diagram:DEdge" uid="_p-1uSmTvEe2qdtyPWAtoxA" sourceNode="_fihqUKA5EeuqkpDnuik1sg" targetNode="_dzVaYGTvEe2qdtyPWAtoxA"> |
2401 | <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//PredicateDefinition"/> | 2337 | <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//PredicateDefinition"/> |
2402 | <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//PredicateDefinition"/> | 2338 | <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//PredicateDefinition"/> |
2403 | <ownedStyle xmi:type="diagram:EdgeStyle" uid="_p-1uS2TvEe2qdtyPWAtoxA" targetArrow="InputClosedArrow" routingStyle="tree"> | 2339 | <ownedStyle xmi:type="diagram:EdgeStyle" uid="_dF7qKDrQEe62Q_vL_UTCsA" targetArrow="InputClosedArrow" routingStyle="tree"> |
2404 | <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@style"/> | 2340 | <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@style"/> |
2405 | <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_p-1uTGTvEe2qdtyPWAtoxA" showIcon="false"> | 2341 | <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_dF7qKTrQEe62Q_vL_UTCsA" showIcon="false"> |
2406 | <labelFormat>italic</labelFormat> | 2342 | <labelFormat>italic</labelFormat> |
2407 | </beginLabelStyle> | 2343 | </beginLabelStyle> |
2408 | <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_p-1uTWTvEe2qdtyPWAtoxA" showIcon="false"/> | 2344 | <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_dF7qKjrQEe62Q_vL_UTCsA" showIcon="false"/> |
2409 | </ownedStyle> | 2345 | </ownedStyle> |
2410 | <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/> | 2346 | <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/> |
2411 | </ownedDiagramElements> | 2347 | </ownedDiagramElements> |
@@ -2611,6 +2547,19 @@ | |||
2611 | <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/> | 2547 | <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/> |
2612 | </ownedElements> | 2548 | </ownedElements> |
2613 | </ownedDiagramElements> | 2549 | </ownedDiagramElements> |
2550 | <ownedDiagramElements xmi:type="diagram:DEdge" uid="_8sdu2DrXEe62Q_vL_UTCsA" name="[0..1] invalidMultiplicity" sourceNode="_c-A7oKA4EeuqkpDnuik1sg" targetNode="_dzVaYGTvEe2qdtyPWAtoxA"> | ||
2551 | <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//ReferenceDeclaration/invalidMultiplicity"/> | ||
2552 | <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//ReferenceDeclaration/invalidMultiplicity"/> | ||
2553 | <ownedStyle xmi:type="diagram:EdgeStyle" uid="_8seV0DrXEe62Q_vL_UTCsA" description="_L-JhMKA4EeuqkpDnuik1sg" sourceArrow="FillDiamond" routingStyle="manhattan" strokeColor="0,0,0"> | ||
2554 | <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_8seV0jrXEe62Q_vL_UTCsA" showIcon="false"> | ||
2555 | <customFeatures>labelSize</customFeatures> | ||
2556 | </centerLabelStyle> | ||
2557 | <endLabelStyle xmi:type="diagram:EndLabelStyle" uid="_8seV0TrXEe62Q_vL_UTCsA" showIcon="false" labelColor="39,76,114"> | ||
2558 | <customFeatures>labelSize</customFeatures> | ||
2559 | </endLabelStyle> | ||
2560 | </ownedStyle> | ||
2561 | <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/> | ||
2562 | </ownedDiagramElements> | ||
2614 | <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/> | 2563 | <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/> |
2615 | <filterVariableHistory xmi:type="diagram:FilterVariableHistory" uid="_CsWlsKA4EeuqkpDnuik1sg"/> | 2564 | <filterVariableHistory xmi:type="diagram:FilterVariableHistory" uid="_CsWlsKA4EeuqkpDnuik1sg"/> |
2616 | <activatedLayers xmi:type="description_1:Layer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer"/> | 2565 | <activatedLayers xmi:type="description_1:Layer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer"/> |
diff --git a/subprojects/language-model/src/main/resources/model/problem.ecore b/subprojects/language-model/src/main/resources/model/problem.ecore index 2d86382d..204f922c 100644 --- a/subprojects/language-model/src/main/resources/model/problem.ecore +++ b/subprojects/language-model/src/main/resources/model/problem.ecore | |||
@@ -22,17 +22,18 @@ | |||
22 | containment="true"/> | 22 | containment="true"/> |
23 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="kind" eType="#//ReferenceKind"/> | 23 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="kind" eType="#//ReferenceKind"/> |
24 | <eStructuralFeatures xsi:type="ecore:EReference" name="referenceType" eType="#//Relation"/> | 24 | <eStructuralFeatures xsi:type="ecore:EReference" name="referenceType" eType="#//Relation"/> |
25 | <eStructuralFeatures xsi:type="ecore:EReference" name="invalidMultiplicity" eType="#//Relation" | ||
26 | containment="true"/> | ||
25 | </eClassifiers> | 27 | </eClassifiers> |
26 | <eClassifiers xsi:type="ecore:EClass" name="NamedElement" abstract="true"> | 28 | <eClassifiers xsi:type="ecore:EClass" name="NamedElement" abstract="true"> |
27 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/> | 29 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/> |
28 | </eClassifiers> | 30 | </eClassifiers> |
29 | <eClassifiers xsi:type="ecore:EClass" name="PredicateDefinition" eSuperTypes="#//ParametricDefinition #//Relation"> | 31 | <eClassifiers xsi:type="ecore:EClass" name="PredicateDefinition" eSuperTypes="#//ParametricDefinition #//Relation"> |
30 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="kind" eType="#//PredicateKind"/> | ||
31 | <eStructuralFeatures xsi:type="ecore:EReference" name="bodies" upperBound="-1" | 32 | <eStructuralFeatures xsi:type="ecore:EReference" name="bodies" upperBound="-1" |
32 | eType="#//Conjunction" containment="true"/> | 33 | eType="#//Conjunction" containment="true"/> |
34 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="error" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/> | ||
33 | </eClassifiers> | 35 | </eClassifiers> |
34 | <eClassifiers xsi:type="ecore:EClass" name="Parameter" eSuperTypes="#//Variable"> | 36 | <eClassifiers xsi:type="ecore:EClass" name="Parameter" eSuperTypes="#//Variable"> |
35 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="modality" eType="#//Modality"/> | ||
36 | <eStructuralFeatures xsi:type="ecore:EReference" name="parameterType" eType="#//Relation"/> | 37 | <eStructuralFeatures xsi:type="ecore:EReference" name="parameterType" eType="#//Relation"/> |
37 | </eClassifiers> | 38 | </eClassifiers> |
38 | <eClassifiers xsi:type="ecore:EClass" name="Variable" abstract="true" eSuperTypes="#//VariableOrNode"/> | 39 | <eClassifiers xsi:type="ecore:EClass" name="Variable" abstract="true" eSuperTypes="#//VariableOrNode"/> |
@@ -169,12 +170,6 @@ | |||
169 | <eLiterals name="CONTAINMENT" value="2"/> | 170 | <eLiterals name="CONTAINMENT" value="2"/> |
170 | <eLiterals name="CONTAINER" value="3"/> | 171 | <eLiterals name="CONTAINER" value="3"/> |
171 | </eClassifiers> | 172 | </eClassifiers> |
172 | <eClassifiers xsi:type="ecore:EEnum" name="PredicateKind"> | ||
173 | <eLiterals name="DEFAULT"/> | ||
174 | <eLiterals name="ERROR" value="1"/> | ||
175 | <eLiterals name="CONTAINED" value="2"/> | ||
176 | <eLiterals name="CONTAINMENT" value="3"/> | ||
177 | </eClassifiers> | ||
178 | <eClassifiers xsi:type="ecore:EClass" name="Expr" abstract="true"/> | 173 | <eClassifiers xsi:type="ecore:EClass" name="Expr" abstract="true"/> |
179 | <eClassifiers xsi:type="ecore:EClass" name="VariableOrNodeExpr" eSuperTypes="#//Expr"> | 174 | <eClassifiers xsi:type="ecore:EClass" name="VariableOrNodeExpr" eSuperTypes="#//Expr"> |
180 | <eStructuralFeatures xsi:type="ecore:EReference" name="variableOrNode" eType="#//VariableOrNode"/> | 175 | <eStructuralFeatures xsi:type="ecore:EReference" name="variableOrNode" eType="#//VariableOrNode"/> |
diff --git a/subprojects/language-model/src/main/resources/model/problem.genmodel b/subprojects/language-model/src/main/resources/model/problem.genmodel index 5767d18d..b5aa81c4 100644 --- a/subprojects/language-model/src/main/resources/model/problem.genmodel +++ b/subprojects/language-model/src/main/resources/model/problem.genmodel | |||
@@ -40,12 +40,6 @@ | |||
40 | <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ReferenceKind/CONTAINMENT"/> | 40 | <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ReferenceKind/CONTAINMENT"/> |
41 | <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ReferenceKind/CONTAINER"/> | 41 | <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ReferenceKind/CONTAINER"/> |
42 | </genEnums> | 42 | </genEnums> |
43 | <genEnums typeSafeEnumCompatible="false" ecoreEnum="problem.ecore#//PredicateKind"> | ||
44 | <genEnumLiterals ecoreEnumLiteral="problem.ecore#//PredicateKind/DEFAULT"/> | ||
45 | <genEnumLiterals ecoreEnumLiteral="problem.ecore#//PredicateKind/ERROR"/> | ||
46 | <genEnumLiterals ecoreEnumLiteral="problem.ecore#//PredicateKind/CONTAINED"/> | ||
47 | <genEnumLiterals ecoreEnumLiteral="problem.ecore#//PredicateKind/CONTAINMENT"/> | ||
48 | </genEnums> | ||
49 | <genEnums typeSafeEnumCompatible="false" ecoreEnum="problem.ecore#//UnaryOp"> | 43 | <genEnums typeSafeEnumCompatible="false" ecoreEnum="problem.ecore#//UnaryOp"> |
50 | <genEnumLiterals ecoreEnumLiteral="problem.ecore#//UnaryOp/PLUS"/> | 44 | <genEnumLiterals ecoreEnumLiteral="problem.ecore#//UnaryOp/PLUS"/> |
51 | <genEnumLiterals ecoreEnumLiteral="problem.ecore#//UnaryOp/MINUS"/> | 45 | <genEnumLiterals ecoreEnumLiteral="problem.ecore#//UnaryOp/MINUS"/> |
@@ -85,16 +79,16 @@ | |||
85 | <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//ReferenceDeclaration/multiplicity"/> | 79 | <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//ReferenceDeclaration/multiplicity"/> |
86 | <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//ReferenceDeclaration/kind"/> | 80 | <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//ReferenceDeclaration/kind"/> |
87 | <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference problem.ecore#//ReferenceDeclaration/referenceType"/> | 81 | <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference problem.ecore#//ReferenceDeclaration/referenceType"/> |
82 | <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//ReferenceDeclaration/invalidMultiplicity"/> | ||
88 | </genClasses> | 83 | </genClasses> |
89 | <genClasses ecoreClass="problem.ecore#//NamedElement"> | 84 | <genClasses ecoreClass="problem.ecore#//NamedElement"> |
90 | <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//NamedElement/name"/> | 85 | <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//NamedElement/name"/> |
91 | </genClasses> | 86 | </genClasses> |
92 | <genClasses ecoreClass="problem.ecore#//PredicateDefinition"> | 87 | <genClasses ecoreClass="problem.ecore#//PredicateDefinition"> |
93 | <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//PredicateDefinition/kind"/> | ||
94 | <genFeatures children="true" createChild="true" propertySortChoices="true" ecoreFeature="ecore:EReference problem.ecore#//PredicateDefinition/bodies"/> | 88 | <genFeatures children="true" createChild="true" propertySortChoices="true" ecoreFeature="ecore:EReference problem.ecore#//PredicateDefinition/bodies"/> |
89 | <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//PredicateDefinition/error"/> | ||
95 | </genClasses> | 90 | </genClasses> |
96 | <genClasses ecoreClass="problem.ecore#//Parameter"> | 91 | <genClasses ecoreClass="problem.ecore#//Parameter"> |
97 | <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//Parameter/modality"/> | ||
98 | <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference problem.ecore#//Parameter/parameterType"/> | 92 | <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference problem.ecore#//Parameter/parameterType"/> |
99 | </genClasses> | 93 | </genClasses> |
100 | <genClasses ecoreClass="problem.ecore#//Variable"/> | 94 | <genClasses ecoreClass="problem.ecore#//Variable"/> |
diff --git a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/model/ModelInitializer.java b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/model/ModelInitializer.java index 06b8ad77..fe67ed2c 100644 --- a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/model/ModelInitializer.java +++ b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/model/ModelInitializer.java | |||
@@ -9,9 +9,7 @@ import com.google.inject.Inject; | |||
9 | import org.eclipse.collections.api.factory.primitive.ObjectIntMaps; | 9 | import org.eclipse.collections.api.factory.primitive.ObjectIntMaps; |
10 | import org.eclipse.collections.api.map.primitive.MutableObjectIntMap; | 10 | import org.eclipse.collections.api.map.primitive.MutableObjectIntMap; |
11 | import tools.refinery.language.model.problem.*; | 11 | import tools.refinery.language.model.problem.*; |
12 | import tools.refinery.language.semantics.model.internal.DecisionTree; | ||
13 | import tools.refinery.language.utils.ProblemDesugarer; | 12 | import tools.refinery.language.utils.ProblemDesugarer; |
14 | import tools.refinery.language.utils.RelationInfo; | ||
15 | import tools.refinery.store.representation.Symbol; | 13 | import tools.refinery.store.representation.Symbol; |
16 | import tools.refinery.store.representation.TruthValue; | 14 | import tools.refinery.store.representation.TruthValue; |
17 | import tools.refinery.store.tuple.Tuple; | 15 | import tools.refinery.store.tuple.Tuple; |
@@ -30,7 +28,7 @@ public class ModelInitializer { | |||
30 | 28 | ||
31 | private int nodeCount = 0; | 29 | private int nodeCount = 0; |
32 | 30 | ||
33 | public void createModel(Problem problem) { | 31 | /*public void createModel(Problem problem) { |
34 | var builtinSymbols = desugarer.getBuiltinSymbols(problem).orElseThrow(() -> new IllegalArgumentException( | 32 | var builtinSymbols = desugarer.getBuiltinSymbols(problem).orElseThrow(() -> new IllegalArgumentException( |
35 | "Problem has no builtin library")); | 33 | "Problem has no builtin library")); |
36 | var collectedSymbols = desugarer.collectSymbols(problem); | 34 | var collectedSymbols = desugarer.collectSymbols(problem); |
@@ -70,7 +68,7 @@ public class ModelInitializer { | |||
70 | defaultAssertions.setAllMissing(TruthValue.FALSE); | 68 | defaultAssertions.setAllMissing(TruthValue.FALSE); |
71 | } | 69 | } |
72 | return defaultAssertions; | 70 | return defaultAssertions; |
73 | } | 71 | }*/ |
74 | 72 | ||
75 | private Tuple getTuple(Assertion assertion) { | 73 | private Tuple getTuple(Assertion assertion) { |
76 | var arguments = assertion.getArguments(); | 74 | var arguments = assertion.getArguments(); |
diff --git a/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext b/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext index 9e330347..0a91178b 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext +++ b/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext | |||
@@ -14,7 +14,7 @@ Problem: | |||
14 | 14 | ||
15 | Statement: | 15 | Statement: |
16 | Assertion | ClassDeclaration | EnumDeclaration | | 16 | Assertion | ClassDeclaration | EnumDeclaration | |
17 | PredicateDefinition | FunctionDefinition | /* RuleDefinition | */ | 17 | PredicateDefinition | /* FunctionDefinition | RuleDefinition | */ |
18 | ScopeDeclaration | IndividualDeclaration; | 18 | ScopeDeclaration | IndividualDeclaration; |
19 | 19 | ||
20 | ClassDeclaration: | 20 | ClassDeclaration: |
@@ -32,7 +32,7 @@ EnumLiteral returns Node: | |||
32 | name=Identifier; | 32 | name=Identifier; |
33 | 33 | ||
34 | FeatureDeclaration: | 34 | FeatureDeclaration: |
35 | ReferenceDeclaration | AttributeDeclaration | FlagDeclaration; | 35 | ReferenceDeclaration /* | AttributeDeclaration | FlagDeclaration */; |
36 | 36 | ||
37 | enum ReferenceKind: | 37 | enum ReferenceKind: |
38 | REFERENCE="refers" | CONTAINMENT="contains" | CONTAINER="container"; | 38 | REFERENCE="refers" | CONTAINMENT="contains" | CONTAINER="container"; |
@@ -44,23 +44,17 @@ ReferenceDeclaration: | |||
44 | name=Identifier | 44 | name=Identifier |
45 | ("opposite" opposite=[ReferenceDeclaration|QualifiedName])?; | 45 | ("opposite" opposite=[ReferenceDeclaration|QualifiedName])?; |
46 | 46 | ||
47 | enum PrimitiveType: | 47 | //enum PrimitiveType: |
48 | INT="int" | REAL="real" | STRING="string"; | 48 | // INT="int" | REAL="real" | STRING="string"; |
49 | 49 | // | |
50 | AttributeDeclaration: | 50 | //AttributeDeclaration: |
51 | attributeType=PrimitiveType name=Identifier; | 51 | // attributeType=PrimitiveType name=Identifier; |
52 | 52 | // | |
53 | FlagDeclaration: | 53 | //FlagDeclaration: |
54 | "bool" name=Identifier; | 54 | // "bool" name=Identifier; |
55 | |||
56 | enum ErrorKind returns PredicateKind: | ||
57 | ERROR="error"; | ||
58 | |||
59 | enum PredicateKind: | ||
60 | ERROR="error" | CONTAINED="contained" | CONTAINMENT="containment"; | ||
61 | 55 | ||
62 | PredicateDefinition: | 56 | PredicateDefinition: |
63 | (kind=ErrorKind | kind=PredicateKind? "pred") | 57 | ("pred" | error?="error" "pred"?) |
64 | name=Identifier | 58 | name=Identifier |
65 | "(" (parameters+=Parameter ("," parameters+=Parameter)*)? ")" | 59 | "(" (parameters+=Parameter ("," parameters+=Parameter)*)? ")" |
66 | ("<->" bodies+=Conjunction (";" bodies+=Conjunction)*)? | 60 | ("<->" bodies+=Conjunction (";" bodies+=Conjunction)*)? |
@@ -69,14 +63,14 @@ PredicateDefinition: | |||
69 | Conjunction: | 63 | Conjunction: |
70 | literals+=Expr ("," literals+=Expr)*; | 64 | literals+=Expr ("," literals+=Expr)*; |
71 | 65 | ||
72 | FunctionDefinition: | 66 | //FunctionDefinition: |
73 | "fn" functionType=PrimitiveType name=Identifier | 67 | // "fn" functionType=PrimitiveType name=Identifier |
74 | "(" (parameters+=Parameter ("," parameters+=Parameter)*)? ")" | 68 | // "(" (parameters+=Parameter ("," parameters+=Parameter)*)? ")" |
75 | ("=" cases+=Case (";" cases+=Case)*)? | 69 | // ("=" cases+=Case (";" cases+=Case)*)? |
76 | "."; | 70 | // "."; |
77 | 71 | // | |
78 | Case: | 72 | //Case: |
79 | Conjunction ({Match.condition=current} "->" value=Expr)?; | 73 | // Conjunction ({Match.condition=current} "->" value=Expr)?; |
80 | 74 | ||
81 | //RuleDefinition: | 75 | //RuleDefinition: |
82 | // "rule" | 76 | // "rule" |
@@ -87,7 +81,7 @@ Case: | |||
87 | // "."; | 81 | // "."; |
88 | 82 | ||
89 | Parameter: | 83 | Parameter: |
90 | (modality=Modality? parameterType=[Relation|QualifiedName])? name=Identifier; | 84 | parameterType=[Relation|QualifiedName]? name=Identifier; |
91 | 85 | ||
92 | //Consequent: | 86 | //Consequent: |
93 | // actions+=Action ("," actions+=Action)*; | 87 | // actions+=Action ("," actions+=Action)*; |
@@ -268,7 +262,7 @@ NonContainmentQualifiedName hidden(): | |||
268 | NonContainmentIdentifier ("::" Identifier)*; | 262 | NonContainmentIdentifier ("::" Identifier)*; |
269 | 263 | ||
270 | Identifier: | 264 | Identifier: |
271 | NonContainmentIdentifier | "contains"; | 265 | NonContainmentIdentifier | "contains" | "container"; |
272 | 266 | ||
273 | NonContainmentIdentifier: | 267 | NonContainmentIdentifier: |
274 | ID | "contained" | "sum" | "prod" | "min" | "max"; | 268 | ID | "contained" | "sum" | "prod" | "min" | "max"; |
diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemDerivedStateComputer.java b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemDerivedStateComputer.java index b145ef27..31eb55a6 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemDerivedStateComputer.java +++ b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemDerivedStateComputer.java | |||
@@ -18,6 +18,7 @@ import org.eclipse.xtext.resource.DerivedStateAwareResource; | |||
18 | import org.eclipse.xtext.resource.IDerivedStateComputer; | 18 | import org.eclipse.xtext.resource.IDerivedStateComputer; |
19 | import org.eclipse.xtext.resource.XtextResource; | 19 | import org.eclipse.xtext.resource.XtextResource; |
20 | import tools.refinery.language.model.problem.*; | 20 | import tools.refinery.language.model.problem.*; |
21 | import tools.refinery.language.utils.ProblemUtil; | ||
21 | 22 | ||
22 | import java.util.*; | 23 | import java.util.*; |
23 | import java.util.function.Function; | 24 | import java.util.function.Function; |
@@ -58,7 +59,7 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer { | |||
58 | } | 59 | } |
59 | 60 | ||
60 | protected void installDerivedProblemState(Problem problem, Adapter adapter, boolean preLinkingPhase) { | 61 | protected void installDerivedProblemState(Problem problem, Adapter adapter, boolean preLinkingPhase) { |
61 | installNewNodes(problem, adapter); | 62 | installDerivedClassDeclarationState(problem, adapter); |
62 | if (preLinkingPhase) { | 63 | if (preLinkingPhase) { |
63 | return; | 64 | return; |
64 | } | 65 | } |
@@ -66,24 +67,67 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer { | |||
66 | derivedVariableComputer.installDerivedVariables(problem, nodeNames); | 67 | derivedVariableComputer.installDerivedVariables(problem, nodeNames); |
67 | } | 68 | } |
68 | 69 | ||
69 | protected void installNewNodes(Problem problem, Adapter adapter) { | 70 | protected void installDerivedClassDeclarationState(Problem problem, Adapter adapter) { |
70 | for (Statement statement : problem.getStatements()) { | 71 | for (var statement : problem.getStatements()) { |
71 | if (statement instanceof ClassDeclaration declaration && !declaration.isAbstract() | 72 | if (statement instanceof ClassDeclaration classDeclaration) { |
72 | && declaration.getNewNode() == null) { | 73 | installOrRemoveNewNode(adapter, classDeclaration); |
74 | for (var featureDeclaration : classDeclaration.getFeatureDeclarations()) { | ||
75 | if (featureDeclaration instanceof ReferenceDeclaration referenceDeclaration) { | ||
76 | installOrRemoveInvalidMultiplicityPredicate(adapter, classDeclaration, referenceDeclaration); | ||
77 | } | ||
78 | } | ||
79 | } | ||
80 | } | ||
81 | } | ||
82 | |||
83 | protected void installOrRemoveNewNode(Adapter adapter, ClassDeclaration declaration) { | ||
84 | if (declaration.isAbstract()) { | ||
85 | var newNode = declaration.getNewNode(); | ||
86 | if (newNode != null) { | ||
87 | declaration.setNewNode(null); | ||
88 | adapter.removeNewNode(declaration); | ||
89 | } | ||
90 | } else { | ||
91 | if (declaration.getNewNode() == null) { | ||
73 | var newNode = adapter.createNewNodeIfAbsent(declaration, key -> createNode(NEW_NODE)); | 92 | var newNode = adapter.createNewNodeIfAbsent(declaration, key -> createNode(NEW_NODE)); |
74 | declaration.setNewNode(newNode); | 93 | declaration.setNewNode(newNode); |
75 | } | 94 | } |
76 | } | 95 | } |
77 | } | 96 | } |
78 | 97 | ||
98 | protected void installOrRemoveInvalidMultiplicityPredicate( | ||
99 | Adapter adapter, ClassDeclaration containingClassDeclaration, ReferenceDeclaration declaration) { | ||
100 | if (ProblemUtil.hasMultiplicityConstraint(declaration)) { | ||
101 | if (declaration.getInvalidMultiplicity() == null) { | ||
102 | var invalidMultiplicity = adapter.createInvalidMultiplicityPredicateIfAbsent(declaration, key -> { | ||
103 | var predicate = ProblemFactory.eINSTANCE.createPredicateDefinition(); | ||
104 | predicate.setError(true); | ||
105 | predicate.setName("invalidMultiplicity"); | ||
106 | var parameter = ProblemFactory.eINSTANCE.createParameter(); | ||
107 | parameter.setParameterType(containingClassDeclaration); | ||
108 | parameter.setName("node"); | ||
109 | predicate.getParameters().add(parameter); | ||
110 | return predicate; | ||
111 | }); | ||
112 | declaration.setInvalidMultiplicity(invalidMultiplicity); | ||
113 | } | ||
114 | } else { | ||
115 | var invalidMultiplicity = declaration.getInvalidMultiplicity(); | ||
116 | if (invalidMultiplicity != null) { | ||
117 | declaration.setInvalidMultiplicity(null); | ||
118 | adapter.removeInvalidMultiplicityPredicate(declaration); | ||
119 | } | ||
120 | } | ||
121 | } | ||
122 | |||
79 | protected Set<String> installDerivedNodes(Problem problem) { | 123 | protected Set<String> installDerivedNodes(Problem problem) { |
80 | var collector = nodeNameCollectorProvider.get(); | 124 | var collector = nodeNameCollectorProvider.get(); |
81 | collector.collectNodeNames(problem); | 125 | collector.collectNodeNames(problem); |
82 | Set<String> nodeNames = collector.getNodeNames(); | 126 | Set<String> nodeNames = collector.getNodeNames(); |
83 | List<Node> grapNodes = problem.getNodes(); | 127 | List<Node> graphNodes = problem.getNodes(); |
84 | for (String nodeName : nodeNames) { | 128 | for (String nodeName : nodeNames) { |
85 | var graphNode = createNode(nodeName); | 129 | var graphNode = createNode(nodeName); |
86 | grapNodes.add(graphNode); | 130 | graphNodes.add(graphNode); |
87 | } | 131 | } |
88 | return nodeNames; | 132 | return nodeNames; |
89 | } | 133 | } |
@@ -104,15 +148,24 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer { | |||
104 | } | 148 | } |
105 | 149 | ||
106 | protected void discardDerivedProblemState(Problem problem, Adapter adapter) { | 150 | protected void discardDerivedProblemState(Problem problem, Adapter adapter) { |
107 | Set<ClassDeclaration> classDeclarations = new HashSet<>(); | 151 | var abstractClassDeclarations = new HashSet<ClassDeclaration>(); |
152 | var referenceDeclarationsWithMultiplicity = new HashSet<ReferenceDeclaration>(); | ||
108 | problem.getNodes().clear(); | 153 | problem.getNodes().clear(); |
109 | for (var statement : problem.getStatements()) { | 154 | for (var statement : problem.getStatements()) { |
110 | if (statement instanceof ClassDeclaration classDeclaration) { | 155 | if (statement instanceof ClassDeclaration classDeclaration) { |
111 | classDeclaration.setNewNode(null); | 156 | classDeclaration.setNewNode(null); |
112 | classDeclarations.add(classDeclaration); | 157 | if (classDeclaration.isAbstract()) { |
158 | abstractClassDeclarations.add(classDeclaration); | ||
159 | } | ||
160 | for (var featureDeclaration : classDeclaration.getFeatureDeclarations()) { | ||
161 | if (featureDeclaration instanceof ReferenceDeclaration referenceDeclaration && | ||
162 | ProblemUtil.hasMultiplicityConstraint(referenceDeclaration)) { | ||
163 | referenceDeclarationsWithMultiplicity.add(referenceDeclaration); | ||
164 | } | ||
165 | } | ||
113 | } | 166 | } |
114 | } | 167 | } |
115 | adapter.retainAll(classDeclarations); | 168 | adapter.retainAll(abstractClassDeclarations, referenceDeclarationsWithMultiplicity); |
116 | derivedVariableComputer.discardDerivedVariables(problem); | 169 | derivedVariableComputer.discardDerivedVariables(problem); |
117 | } | 170 | } |
118 | 171 | ||
@@ -134,14 +187,31 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer { | |||
134 | 187 | ||
135 | protected static class Adapter extends AdapterImpl { | 188 | protected static class Adapter extends AdapterImpl { |
136 | private final Map<ClassDeclaration, Node> newNodes = new HashMap<>(); | 189 | private final Map<ClassDeclaration, Node> newNodes = new HashMap<>(); |
190 | private final Map<ReferenceDeclaration, PredicateDefinition> invalidMultiplicityPredicates = new HashMap<>(); | ||
137 | 191 | ||
138 | public Node createNewNodeIfAbsent(ClassDeclaration classDeclaration, | 192 | public Node createNewNodeIfAbsent(ClassDeclaration classDeclaration, |
139 | Function<ClassDeclaration, Node> createNode) { | 193 | Function<ClassDeclaration, Node> createNode) { |
140 | return newNodes.computeIfAbsent(classDeclaration, createNode); | 194 | return newNodes.computeIfAbsent(classDeclaration, createNode); |
141 | } | 195 | } |
142 | 196 | ||
143 | public void retainAll(Collection<ClassDeclaration> classDeclarations) { | 197 | public void removeNewNode(ClassDeclaration classDeclaration) { |
144 | newNodes.keySet().retainAll(classDeclarations); | 198 | newNodes.remove(classDeclaration); |
199 | } | ||
200 | |||
201 | public PredicateDefinition createInvalidMultiplicityPredicateIfAbsent( | ||
202 | ReferenceDeclaration referenceDeclaration, | ||
203 | Function<ReferenceDeclaration, PredicateDefinition> createPredicate) { | ||
204 | return invalidMultiplicityPredicates.computeIfAbsent(referenceDeclaration, createPredicate); | ||
205 | } | ||
206 | |||
207 | public void removeInvalidMultiplicityPredicate(ReferenceDeclaration referenceDeclaration) { | ||
208 | invalidMultiplicityPredicates.remove(referenceDeclaration); | ||
209 | } | ||
210 | |||
211 | public void retainAll(Collection<ClassDeclaration> abstractClassDeclarations, | ||
212 | Collection<ReferenceDeclaration> referenceDeclarationsWithMultiplicity) { | ||
213 | newNodes.keySet().retainAll(abstractClassDeclarations); | ||
214 | invalidMultiplicityPredicates.keySet().retainAll(referenceDeclarationsWithMultiplicity); | ||
145 | } | 215 | } |
146 | 216 | ||
147 | @Override | 217 | @Override |
diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemLocationInFileProvider.java b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemLocationInFileProvider.java index 1fe2df89..29eaad84 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemLocationInFileProvider.java +++ b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemLocationInFileProvider.java | |||
@@ -8,7 +8,6 @@ package tools.refinery.language.resource; | |||
8 | import org.eclipse.emf.ecore.EObject; | 8 | import org.eclipse.emf.ecore.EObject; |
9 | import org.eclipse.xtext.resource.DefaultLocationInFileProvider; | 9 | import org.eclipse.xtext.resource.DefaultLocationInFileProvider; |
10 | import org.eclipse.xtext.util.ITextRegion; | 10 | import org.eclipse.xtext.util.ITextRegion; |
11 | |||
12 | import tools.refinery.language.model.problem.ImplicitVariable; | 11 | import tools.refinery.language.model.problem.ImplicitVariable; |
13 | import tools.refinery.language.model.problem.Node; | 12 | import tools.refinery.language.model.problem.Node; |
14 | import tools.refinery.language.utils.ProblemUtil; | 13 | import tools.refinery.language.utils.ProblemUtil; |
diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java index 630be379..a16f77eb 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java +++ b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java | |||
@@ -5,6 +5,9 @@ | |||
5 | */ | 5 | */ |
6 | package tools.refinery.language.resource; | 6 | package tools.refinery.language.resource; |
7 | 7 | ||
8 | import com.google.common.collect.ImmutableMap; | ||
9 | import com.google.inject.Inject; | ||
10 | import com.google.inject.Singleton; | ||
8 | import org.eclipse.emf.ecore.EObject; | 11 | import org.eclipse.emf.ecore.EObject; |
9 | import org.eclipse.xtext.EcoreUtil2; | 12 | import org.eclipse.xtext.EcoreUtil2; |
10 | import org.eclipse.xtext.naming.IQualifiedNameConverter; | 13 | import org.eclipse.xtext.naming.IQualifiedNameConverter; |
@@ -13,19 +16,18 @@ import org.eclipse.xtext.resource.EObjectDescription; | |||
13 | import org.eclipse.xtext.resource.IEObjectDescription; | 16 | import org.eclipse.xtext.resource.IEObjectDescription; |
14 | import org.eclipse.xtext.resource.impl.DefaultResourceDescriptionStrategy; | 17 | import org.eclipse.xtext.resource.impl.DefaultResourceDescriptionStrategy; |
15 | import org.eclipse.xtext.util.IAcceptor; | 18 | import org.eclipse.xtext.util.IAcceptor; |
16 | 19 | import tools.refinery.language.model.problem.*; | |
17 | import com.google.inject.Inject; | ||
18 | import com.google.inject.Singleton; | ||
19 | |||
20 | import tools.refinery.language.model.problem.NamedElement; | ||
21 | import tools.refinery.language.model.problem.Node; | ||
22 | import tools.refinery.language.model.problem.Problem; | ||
23 | import tools.refinery.language.model.problem.Variable; | ||
24 | import tools.refinery.language.naming.NamingUtil; | 20 | import tools.refinery.language.naming.NamingUtil; |
25 | import tools.refinery.language.utils.ProblemUtil; | 21 | import tools.refinery.language.utils.ProblemUtil; |
26 | 22 | ||
23 | import java.util.Map; | ||
24 | |||
27 | @Singleton | 25 | @Singleton |
28 | public class ProblemResourceDescriptionStrategy extends DefaultResourceDescriptionStrategy { | 26 | public class ProblemResourceDescriptionStrategy extends DefaultResourceDescriptionStrategy { |
27 | public static final String ERROR_PREDICATE = "tools.refinery.language.resource" + | ||
28 | ".ProblemResourceDescriptionStrategy.ERROR_PREDICATE"; | ||
29 | public static final String ERROR_PREDICATE_TRUE = "true"; | ||
30 | |||
29 | @Inject | 31 | @Inject |
30 | private IQualifiedNameConverter qualifiedNameConverter; | 32 | private IQualifiedNameConverter qualifiedNameConverter; |
31 | 33 | ||
@@ -40,9 +42,10 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti | |||
40 | } | 42 | } |
41 | var problem = EcoreUtil2.getContainerOfType(eObject, Problem.class); | 43 | var problem = EcoreUtil2.getContainerOfType(eObject, Problem.class); |
42 | var problemQualifiedName = getNameAsQualifiedName(problem); | 44 | var problemQualifiedName = getNameAsQualifiedName(problem); |
45 | var userData = getUserData(eObject); | ||
43 | boolean nameExported; | 46 | boolean nameExported; |
44 | if (shouldExportSimpleName(eObject)) { | 47 | if (shouldExportSimpleName(eObject)) { |
45 | acceptEObjectDescription(eObject, problemQualifiedName, qualifiedName, acceptor); | 48 | acceptEObjectDescription(eObject, problemQualifiedName, qualifiedName, userData, acceptor); |
46 | nameExported = true; | 49 | nameExported = true; |
47 | } else { | 50 | } else { |
48 | nameExported = false; | 51 | nameExported = false; |
@@ -56,7 +59,7 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti | |||
56 | } | 59 | } |
57 | qualifiedName = parentQualifiedName.append(qualifiedName); | 60 | qualifiedName = parentQualifiedName.append(qualifiedName); |
58 | if (shouldExportSimpleName(parent)) { | 61 | if (shouldExportSimpleName(parent)) { |
59 | acceptEObjectDescription(eObject, problemQualifiedName, qualifiedName, acceptor); | 62 | acceptEObjectDescription(eObject, problemQualifiedName, qualifiedName, userData, acceptor); |
60 | nameExported = true; | 63 | nameExported = true; |
61 | } else { | 64 | } else { |
62 | nameExported = false; | 65 | nameExported = false; |
@@ -64,16 +67,15 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti | |||
64 | parent = parent.eContainer(); | 67 | parent = parent.eContainer(); |
65 | } | 68 | } |
66 | if (!nameExported) { | 69 | if (!nameExported) { |
67 | acceptEObjectDescription(eObject, problemQualifiedName, qualifiedName, acceptor); | 70 | acceptEObjectDescription(eObject, problemQualifiedName, qualifiedName, userData, acceptor); |
68 | } | 71 | } |
69 | return true; | 72 | return true; |
70 | } | 73 | } |
71 | 74 | ||
72 | protected QualifiedName getNameAsQualifiedName(EObject eObject) { | 75 | protected QualifiedName getNameAsQualifiedName(EObject eObject) { |
73 | if (!(eObject instanceof NamedElement)) { | 76 | if (!(eObject instanceof NamedElement namedElement)) { |
74 | return null; | 77 | return null; |
75 | } | 78 | } |
76 | var namedElement = (NamedElement) eObject; | ||
77 | var name = namedElement.getName(); | 79 | var name = namedElement.getName(); |
78 | if (NamingUtil.isNullOrEmpty(name)) { | 80 | if (NamingUtil.isNullOrEmpty(name)) { |
79 | return null; | 81 | return null; |
@@ -93,16 +95,28 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti | |||
93 | return true; | 95 | return true; |
94 | } | 96 | } |
95 | 97 | ||
98 | protected Map<String, String> getUserData(EObject eObject) { | ||
99 | var builder = ImmutableMap.<String, String>builder(); | ||
100 | if (eObject instanceof PredicateDefinition predicateDefinition && predicateDefinition.isError()) { | ||
101 | builder.put(ERROR_PREDICATE, ERROR_PREDICATE_TRUE); | ||
102 | } | ||
103 | return builder.build(); | ||
104 | } | ||
105 | |||
96 | protected boolean shouldExportSimpleName(EObject eObject) { | 106 | protected boolean shouldExportSimpleName(EObject eObject) { |
97 | if (eObject instanceof Node node) { | 107 | if (eObject instanceof Node node) { |
98 | return !ProblemUtil.isNewNode(node); | 108 | return !ProblemUtil.isNewNode(node); |
99 | } | 109 | } |
110 | if (eObject instanceof PredicateDefinition predicateDefinition) { | ||
111 | return !ProblemUtil.isInvalidMultiplicityConstraint(predicateDefinition); | ||
112 | } | ||
100 | return true; | 113 | return true; |
101 | } | 114 | } |
102 | 115 | ||
103 | private void acceptEObjectDescription(EObject eObject, QualifiedName prefix, QualifiedName qualifiedName, | 116 | private void acceptEObjectDescription(EObject eObject, QualifiedName prefix, QualifiedName qualifiedName, |
104 | IAcceptor<IEObjectDescription> acceptor) { | 117 | Map<String, String> userData, IAcceptor<IEObjectDescription> acceptor) { |
105 | var qualifiedNameWithPrefix = prefix == null ? qualifiedName : prefix.append(qualifiedName); | 118 | var qualifiedNameWithPrefix = prefix == null ? qualifiedName : prefix.append(qualifiedName); |
106 | acceptor.accept(EObjectDescription.create(qualifiedNameWithPrefix, eObject)); | 119 | var description = EObjectDescription.create(qualifiedNameWithPrefix, eObject, userData); |
120 | acceptor.accept(description); | ||
107 | } | 121 | } |
108 | } | 122 | } |
diff --git a/subprojects/language/src/main/java/tools/refinery/language/utils/BuiltinSymbols.java b/subprojects/language/src/main/java/tools/refinery/language/utils/BuiltinSymbols.java index c8c7fd4a..70a86b51 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/utils/BuiltinSymbols.java +++ b/subprojects/language/src/main/java/tools/refinery/language/utils/BuiltinSymbols.java | |||
@@ -7,7 +7,7 @@ package tools.refinery.language.utils; | |||
7 | 7 | ||
8 | import tools.refinery.language.model.problem.*; | 8 | import tools.refinery.language.model.problem.*; |
9 | 9 | ||
10 | public record BuiltinSymbols(Problem problem, ClassDeclaration node, ReferenceDeclaration equals, | 10 | public record BuiltinSymbols(Problem problem, ClassDeclaration node, PredicateDefinition equals, |
11 | PredicateDefinition exists, PredicateDefinition contained, PredicateDefinition contains, | 11 | PredicateDefinition exists, ClassDeclaration contained, PredicateDefinition contains, |
12 | PredicateDefinition root) { | 12 | PredicateDefinition invalidNumberOfContainers) { |
13 | } | 13 | } |
diff --git a/subprojects/language/src/main/java/tools/refinery/language/utils/CollectedSymbols.java b/subprojects/language/src/main/java/tools/refinery/language/utils/CollectedSymbols.java deleted file mode 100644 index e4e4d07a..00000000 --- a/subprojects/language/src/main/java/tools/refinery/language/utils/CollectedSymbols.java +++ /dev/null | |||
@@ -1,15 +0,0 @@ | |||
1 | /* | ||
2 | * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> | ||
3 | * | ||
4 | * SPDX-License-Identifier: EPL-2.0 | ||
5 | */ | ||
6 | package tools.refinery.language.utils; | ||
7 | |||
8 | import java.util.Map; | ||
9 | |||
10 | import tools.refinery.language.model.problem.Node; | ||
11 | import tools.refinery.language.model.problem.Relation; | ||
12 | |||
13 | public record CollectedSymbols(Map<Node, NodeInfo> nodes, Map<Relation, RelationInfo> relations) { | ||
14 | |||
15 | } | ||
diff --git a/subprojects/language/src/main/java/tools/refinery/language/utils/ContainmentRole.java b/subprojects/language/src/main/java/tools/refinery/language/utils/ContainmentRole.java deleted file mode 100644 index a43c7dfe..00000000 --- a/subprojects/language/src/main/java/tools/refinery/language/utils/ContainmentRole.java +++ /dev/null | |||
@@ -1,22 +0,0 @@ | |||
1 | /* | ||
2 | * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> | ||
3 | * | ||
4 | * SPDX-License-Identifier: EPL-2.0 | ||
5 | */ | ||
6 | package tools.refinery.language.utils; | ||
7 | |||
8 | import tools.refinery.language.model.problem.PredicateKind; | ||
9 | |||
10 | public enum ContainmentRole { | ||
11 | NONE, | ||
12 | CONTAINED, | ||
13 | CONTAINMENT; | ||
14 | |||
15 | public static ContainmentRole fromPredicateKind(PredicateKind predicateKind) { | ||
16 | return switch (predicateKind) { | ||
17 | case CONTAINED -> CONTAINED; | ||
18 | case CONTAINMENT -> CONTAINMENT; | ||
19 | default -> NONE; | ||
20 | }; | ||
21 | } | ||
22 | } | ||
diff --git a/subprojects/language/src/main/java/tools/refinery/language/utils/NodeInfo.java b/subprojects/language/src/main/java/tools/refinery/language/utils/NodeInfo.java deleted file mode 100644 index 0fa7a454..00000000 --- a/subprojects/language/src/main/java/tools/refinery/language/utils/NodeInfo.java +++ /dev/null | |||
@@ -1,9 +0,0 @@ | |||
1 | /* | ||
2 | * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> | ||
3 | * | ||
4 | * SPDX-License-Identifier: EPL-2.0 | ||
5 | */ | ||
6 | package tools.refinery.language.utils; | ||
7 | |||
8 | public record NodeInfo(String name, boolean individual) { | ||
9 | } | ||
diff --git a/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemDesugarer.java b/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemDesugarer.java index 738a0896..9f08654c 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemDesugarer.java +++ b/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemDesugarer.java | |||
@@ -6,7 +6,6 @@ | |||
6 | package tools.refinery.language.utils; | 6 | package tools.refinery.language.utils; |
7 | 7 | ||
8 | import com.google.inject.Inject; | 8 | import com.google.inject.Inject; |
9 | import com.google.inject.Provider; | ||
10 | import com.google.inject.Singleton; | 9 | import com.google.inject.Singleton; |
11 | import org.eclipse.emf.ecore.EObject; | 10 | import org.eclipse.emf.ecore.EObject; |
12 | import org.eclipse.emf.ecore.resource.Resource; | 11 | import org.eclipse.emf.ecore.resource.Resource; |
@@ -21,9 +20,6 @@ public class ProblemDesugarer { | |||
21 | @Inject | 20 | @Inject |
22 | private IResourceScopeCache cache = IResourceScopeCache.NullImpl.INSTANCE; | 21 | private IResourceScopeCache cache = IResourceScopeCache.NullImpl.INSTANCE; |
23 | 22 | ||
24 | @Inject | ||
25 | private Provider<SymbolCollector> symbolCollectorProvider; | ||
26 | |||
27 | public Optional<Problem> getBuiltinProblem(EObject context) { | 23 | public Optional<Problem> getBuiltinProblem(EObject context) { |
28 | return Optional.ofNullable(context).map(EObject::eResource).flatMap(resource -> | 24 | return Optional.ofNullable(context).map(EObject::eResource).flatMap(resource -> |
29 | cache.get("builtinProblem", resource, () -> doGetBuiltinProblem(resource))); | 25 | cache.get("builtinProblem", resource, () -> doGetBuiltinProblem(resource))); |
@@ -43,12 +39,13 @@ public class ProblemDesugarer { | |||
43 | 39 | ||
44 | private BuiltinSymbols doGetBuiltinSymbols(Problem builtin) { | 40 | private BuiltinSymbols doGetBuiltinSymbols(Problem builtin) { |
45 | var node = doGetDeclaration(builtin, ClassDeclaration.class, "node"); | 41 | var node = doGetDeclaration(builtin, ClassDeclaration.class, "node"); |
46 | var equals = doGetEqualsReference(node); | 42 | var equals = doGetDeclaration(builtin, PredicateDefinition.class, "equals"); |
47 | var exists = doGetDeclaration(builtin, PredicateDefinition.class, "exists"); | 43 | var exists = doGetDeclaration(builtin, PredicateDefinition.class, "exists"); |
48 | var contained = doGetDeclaration(builtin, PredicateDefinition.class, "contained"); | 44 | var contained = doGetDeclaration(builtin, ClassDeclaration.class, "contained"); |
49 | var contains = doGetDeclaration(builtin, PredicateDefinition.class, "contains"); | 45 | var contains = doGetDeclaration(builtin, PredicateDefinition.class, "contains"); |
50 | var root = doGetDeclaration(builtin, PredicateDefinition.class, "root"); | 46 | var invalidNumberOfContainers = doGetDeclaration(builtin, PredicateDefinition.class, |
51 | return new BuiltinSymbols(builtin, node, equals, exists, contained, contains, root); | 47 | "invalidNumberOfContainers"); |
48 | return new BuiltinSymbols(builtin, node, equals, exists, contained, contains, invalidNumberOfContainers); | ||
52 | } | 49 | } |
53 | 50 | ||
54 | private <T extends Statement & NamedElement> T doGetDeclaration(Problem builtin, Class<T> type, String name) { | 51 | private <T extends Statement & NamedElement> T doGetDeclaration(Problem builtin, Class<T> type, String name) { |
@@ -57,13 +54,6 @@ public class ProblemDesugarer { | |||
57 | .orElseThrow(() -> new IllegalArgumentException("Built-in declaration " + name + " was not found")); | 54 | .orElseThrow(() -> new IllegalArgumentException("Built-in declaration " + name + " was not found")); |
58 | } | 55 | } |
59 | 56 | ||
60 | private ReferenceDeclaration doGetEqualsReference(ClassDeclaration nodeClassDeclaration) { | ||
61 | return (ReferenceDeclaration) nodeClassDeclaration.getFeatureDeclarations().stream() | ||
62 | .filter(reference -> reference instanceof ReferenceDeclaration && | ||
63 | "equals".equals(reference.getName())).findFirst() | ||
64 | .orElseThrow(() -> new IllegalArgumentException("Reference " + "equals" + " not found")); | ||
65 | } | ||
66 | |||
67 | public Collection<ClassDeclaration> getSuperclassesAndSelf(ClassDeclaration classDeclaration) { | 57 | public Collection<ClassDeclaration> getSuperclassesAndSelf(ClassDeclaration classDeclaration) { |
68 | return cache.get(Tuples.create(classDeclaration, "superclassesAndSelf"), classDeclaration.eResource(), | 58 | return cache.get(Tuples.create(classDeclaration, "superclassesAndSelf"), classDeclaration.eResource(), |
69 | () -> doGetSuperclassesAndSelf(classDeclaration)); | 59 | () -> doGetSuperclassesAndSelf(classDeclaration)); |
@@ -109,9 +99,4 @@ public class ProblemDesugarer { | |||
109 | public boolean isContainmentReference(ReferenceDeclaration referenceDeclaration) { | 99 | public boolean isContainmentReference(ReferenceDeclaration referenceDeclaration) { |
110 | return referenceDeclaration.getKind() == ReferenceKind.CONTAINMENT; | 100 | return referenceDeclaration.getKind() == ReferenceKind.CONTAINMENT; |
111 | } | 101 | } |
112 | |||
113 | public CollectedSymbols collectSymbols(Problem problem) { | ||
114 | return cache.get(Tuples.create(problem, "collectedSymbols"), problem.eResource(), | ||
115 | () -> symbolCollectorProvider.get().collectSymbols(problem)); | ||
116 | } | ||
117 | } | 102 | } |
diff --git a/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java b/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java index 9486dc2a..bac274b0 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java +++ b/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java | |||
@@ -8,32 +8,12 @@ package tools.refinery.language.utils; | |||
8 | import org.eclipse.emf.common.util.URI; | 8 | import org.eclipse.emf.common.util.URI; |
9 | import org.eclipse.emf.ecore.EObject; | 9 | import org.eclipse.emf.ecore.EObject; |
10 | 10 | ||
11 | import tools.refinery.language.model.problem.ImplicitVariable; | 11 | import tools.refinery.language.model.problem.*; |
12 | import tools.refinery.language.model.problem.Node; | ||
13 | import tools.refinery.language.model.problem.ProblemPackage; | ||
14 | import tools.refinery.language.model.problem.Variable; | ||
15 | 12 | ||
16 | public final class ProblemUtil { | 13 | public final class ProblemUtil { |
17 | public static final String BUILTIN_LIBRARY_NAME = "builtin"; | 14 | public static final String BUILTIN_LIBRARY_NAME = "builtin"; |
18 | |||
19 | public static final URI BUILTIN_LIBRARY_URI = getLibraryUri(BUILTIN_LIBRARY_NAME); | 15 | public static final URI BUILTIN_LIBRARY_URI = getLibraryUri(BUILTIN_LIBRARY_NAME); |
20 | 16 | ||
21 | public static final String NODE_CLASS_NAME = "node"; | ||
22 | |||
23 | public static final String DOMAIN_CLASS_NAME = "domain"; | ||
24 | |||
25 | public static final String DATA_CLASS_NAME = "data"; | ||
26 | |||
27 | public static final String INT_CLASS_NAME = "int"; | ||
28 | |||
29 | public static final String REAL_CLASS_NAME = "real"; | ||
30 | |||
31 | public static final String STRING_CLASS_NAME = "string"; | ||
32 | |||
33 | public static final String EQUALS_RELATION_NAME = "equals"; | ||
34 | |||
35 | public static final String EXISTS_PREDICATE_NAME = "exists"; | ||
36 | |||
37 | private ProblemUtil() { | 17 | private ProblemUtil() { |
38 | throw new IllegalStateException("This is a static utility class and should not be instantiated directly"); | 18 | throw new IllegalStateException("This is a static utility class and should not be instantiated directly"); |
39 | } | 19 | } |
@@ -80,6 +60,22 @@ public final class ProblemUtil { | |||
80 | return node.eContainingFeature() == ProblemPackage.Literals.CLASS_DECLARATION__NEW_NODE; | 60 | return node.eContainingFeature() == ProblemPackage.Literals.CLASS_DECLARATION__NEW_NODE; |
81 | } | 61 | } |
82 | 62 | ||
63 | public static boolean isInvalidMultiplicityConstraint(PredicateDefinition predicateDefinition) { | ||
64 | return predicateDefinition.eContainingFeature() == | ||
65 | ProblemPackage.Literals.REFERENCE_DECLARATION__INVALID_MULTIPLICITY; | ||
66 | } | ||
67 | |||
68 | public static boolean hasMultiplicityConstraint(ReferenceDeclaration referenceDeclaration) { | ||
69 | var multiplicity = referenceDeclaration.getMultiplicity(); | ||
70 | if (multiplicity instanceof UnboundedMultiplicity) { | ||
71 | return false; | ||
72 | } | ||
73 | if (multiplicity instanceof RangeMultiplicity rangeMultiplicity) { | ||
74 | return rangeMultiplicity.getLowerBound() > 0 || rangeMultiplicity.getUpperBound() >= 0; | ||
75 | } | ||
76 | return true; | ||
77 | } | ||
78 | |||
83 | private static URI getLibraryUri(String libraryName) { | 79 | private static URI getLibraryUri(String libraryName) { |
84 | return URI.createURI(ProblemUtil.class.getClassLoader() | 80 | return URI.createURI(ProblemUtil.class.getClassLoader() |
85 | .getResource("tools/refinery/language/%s.problem".formatted(libraryName)).toString()); | 81 | .getResource("tools/refinery/language/%s.problem".formatted(libraryName)).toString()); |
diff --git a/subprojects/language/src/main/java/tools/refinery/language/utils/RelationInfo.java b/subprojects/language/src/main/java/tools/refinery/language/utils/RelationInfo.java deleted file mode 100644 index 1c46fe72..00000000 --- a/subprojects/language/src/main/java/tools/refinery/language/utils/RelationInfo.java +++ /dev/null | |||
@@ -1,29 +0,0 @@ | |||
1 | /* | ||
2 | * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> | ||
3 | * | ||
4 | * SPDX-License-Identifier: EPL-2.0 | ||
5 | */ | ||
6 | package tools.refinery.language.utils; | ||
7 | |||
8 | import tools.refinery.language.model.problem.*; | ||
9 | |||
10 | import java.util.ArrayList; | ||
11 | import java.util.Collection; | ||
12 | import java.util.List; | ||
13 | |||
14 | public record RelationInfo(String name, ContainmentRole containmentRole, List<Parameter> parameters, | ||
15 | Multiplicity multiplicity, Relation opposite, Collection<Conjunction> bodies, | ||
16 | Collection<Assertion> assertions, Collection<TypeScope> typeScopes) { | ||
17 | public RelationInfo(String name, ContainmentRole containmentRole, List<Parameter> parameters, | ||
18 | Multiplicity multiplicity, Relation opposite, Collection<Conjunction> bodies) { | ||
19 | this(name, containmentRole, parameters, multiplicity, opposite, bodies, new ArrayList<>(), new ArrayList<>()); | ||
20 | } | ||
21 | |||
22 | public boolean hasDefinition() { | ||
23 | return bodies != null && !bodies.isEmpty(); | ||
24 | } | ||
25 | |||
26 | public int arity() { | ||
27 | return parameters.size(); | ||
28 | } | ||
29 | } | ||
diff --git a/subprojects/language/src/main/java/tools/refinery/language/utils/SymbolCollector.java b/subprojects/language/src/main/java/tools/refinery/language/utils/SymbolCollector.java deleted file mode 100644 index a4ea1113..00000000 --- a/subprojects/language/src/main/java/tools/refinery/language/utils/SymbolCollector.java +++ /dev/null | |||
@@ -1,255 +0,0 @@ | |||
1 | /* | ||
2 | * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> | ||
3 | * | ||
4 | * SPDX-License-Identifier: EPL-2.0 | ||
5 | */ | ||
6 | package tools.refinery.language.utils; | ||
7 | |||
8 | import com.google.inject.Inject; | ||
9 | import org.eclipse.emf.ecore.EObject; | ||
10 | import org.eclipse.xtext.naming.IQualifiedNameConverter; | ||
11 | import org.eclipse.xtext.naming.IQualifiedNameProvider; | ||
12 | import tools.refinery.language.model.problem.*; | ||
13 | |||
14 | import java.util.LinkedHashMap; | ||
15 | import java.util.List; | ||
16 | import java.util.Map; | ||
17 | |||
18 | class SymbolCollector { | ||
19 | @Inject | ||
20 | private IQualifiedNameProvider qualifiedNameProvider; | ||
21 | |||
22 | @Inject | ||
23 | private IQualifiedNameConverter qualifiedNameConverter; | ||
24 | |||
25 | @Inject | ||
26 | private ProblemDesugarer desugarer; | ||
27 | |||
28 | private BuiltinSymbols builtinSymbols; | ||
29 | |||
30 | private final Map<Node, NodeInfo> nodes = new LinkedHashMap<>(); | ||
31 | |||
32 | private final Map<Relation, RelationInfo> relations = new LinkedHashMap<>(); | ||
33 | |||
34 | public CollectedSymbols collectSymbols(Problem problem) { | ||
35 | builtinSymbols = desugarer.getBuiltinSymbols(problem).orElseThrow(() -> new IllegalArgumentException( | ||
36 | "Problem has no associated built-in library")); | ||
37 | collectOwnSymbols(builtinSymbols.problem()); | ||
38 | collectOwnSymbols(problem); | ||
39 | return new CollectedSymbols(nodes, relations); | ||
40 | } | ||
41 | |||
42 | public void collectOwnSymbols(Problem problem) { | ||
43 | collectOwnRelations(problem); | ||
44 | collectOwnNodes(problem); | ||
45 | collectOwnAssertions(problem); | ||
46 | } | ||
47 | |||
48 | private void collectOwnRelations(Problem problem) { | ||
49 | for (var statement : problem.getStatements()) { | ||
50 | if (statement instanceof PredicateDefinition predicateDefinition) { | ||
51 | collectPredicate(predicateDefinition); | ||
52 | } else if (statement instanceof ClassDeclaration classDeclaration) { | ||
53 | collectClass(classDeclaration); | ||
54 | } else if (statement instanceof EnumDeclaration enumDeclaration) { | ||
55 | collectEnum(enumDeclaration); | ||
56 | } else if (statement instanceof RuleDefinition) { | ||
57 | throw new UnsupportedOperationException("Rules are not currently supported"); | ||
58 | } | ||
59 | } | ||
60 | } | ||
61 | |||
62 | private void collectPredicate(PredicateDefinition predicateDefinition) { | ||
63 | var predicateKind = predicateDefinition.getKind(); | ||
64 | var info = new RelationInfo(getQualifiedNameString(predicateDefinition), | ||
65 | ContainmentRole.fromPredicateKind(predicateKind), predicateDefinition.getParameters(), null, null, | ||
66 | predicateDefinition.getBodies()); | ||
67 | relations.put(predicateDefinition, info); | ||
68 | } | ||
69 | |||
70 | private void collectClass(ClassDeclaration classDeclaration) { | ||
71 | var contained = classDeclaration != builtinSymbols.node(); | ||
72 | var containmentRole = contained ? ContainmentRole.CONTAINED : ContainmentRole.NONE; | ||
73 | var instanceParameter = ProblemFactory.eINSTANCE.createParameter(); | ||
74 | instanceParameter.setName("instance"); | ||
75 | var classInfo = new RelationInfo(getQualifiedNameString(classDeclaration), containmentRole, | ||
76 | List.of(instanceParameter), null, null, List.of()); | ||
77 | relations.put(classDeclaration, classInfo); | ||
78 | collectFeatures(classDeclaration); | ||
79 | } | ||
80 | |||
81 | private void collectFeatures(ClassDeclaration classDeclaration) { | ||
82 | for (var featureDeclaration : classDeclaration.getFeatureDeclarations()) { | ||
83 | if (featureDeclaration instanceof ReferenceDeclaration referenceDeclaration) { | ||
84 | collectReference(classDeclaration, referenceDeclaration); | ||
85 | } else if (featureDeclaration instanceof AttributeDeclaration attributeDeclaration) { | ||
86 | collectAttribute(classDeclaration, attributeDeclaration); | ||
87 | } else if (featureDeclaration instanceof FlagDeclaration flagDeclaration) { | ||
88 | collectFlag(classDeclaration, flagDeclaration); | ||
89 | } else { | ||
90 | throw new IllegalArgumentException("Unknown FeatureDeclaration: " + featureDeclaration); | ||
91 | } | ||
92 | } | ||
93 | } | ||
94 | |||
95 | private void collectReference(ClassDeclaration classDeclaration, ReferenceDeclaration referenceDeclaration) { | ||
96 | var referenceRole = desugarer.isContainmentReference(referenceDeclaration) ? | ||
97 | ContainmentRole.CONTAINMENT : | ||
98 | ContainmentRole.NONE; | ||
99 | var sourceParameter = ProblemFactory.eINSTANCE.createParameter(); | ||
100 | sourceParameter.setName("source"); | ||
101 | sourceParameter.setParameterType(classDeclaration); | ||
102 | var targetParameter = ProblemFactory.eINSTANCE.createParameter(); | ||
103 | targetParameter.setName("target"); | ||
104 | var multiplicity = referenceDeclaration.getMultiplicity(); | ||
105 | if (multiplicity == null) { | ||
106 | var exactMultiplicity = ProblemFactory.eINSTANCE.createExactMultiplicity(); | ||
107 | exactMultiplicity.setExactValue(1); | ||
108 | multiplicity = exactMultiplicity; | ||
109 | } | ||
110 | targetParameter.setParameterType(referenceDeclaration.getReferenceType()); | ||
111 | var referenceInfo = new RelationInfo(getQualifiedNameString(referenceDeclaration), referenceRole, | ||
112 | List.of(sourceParameter, targetParameter), multiplicity, referenceDeclaration.getOpposite(), | ||
113 | List.of()); | ||
114 | this.relations.put(referenceDeclaration, referenceInfo); | ||
115 | } | ||
116 | |||
117 | private void collectAttribute(ClassDeclaration classDeclaration, AttributeDeclaration attributeDeclaration) { | ||
118 | // TODO Implement attribute handling. | ||
119 | } | ||
120 | |||
121 | private void collectFlag(ClassDeclaration classDeclaration, FlagDeclaration flagDeclaration) { | ||
122 | var parameter = ProblemFactory.eINSTANCE.createParameter(); | ||
123 | parameter.setName("object"); | ||
124 | parameter.setParameterType(classDeclaration); | ||
125 | var referenceInfo = new RelationInfo(getQualifiedNameString(flagDeclaration), ContainmentRole.NONE, | ||
126 | List.of(parameter), null, null, List.of()); | ||
127 | this.relations.put(flagDeclaration, referenceInfo); | ||
128 | } | ||
129 | |||
130 | private void collectEnum(EnumDeclaration enumDeclaration) { | ||
131 | var instanceParameter = ProblemFactory.eINSTANCE.createParameter(); | ||
132 | instanceParameter.setName("instance"); | ||
133 | var info = new RelationInfo(getQualifiedNameString(enumDeclaration), ContainmentRole.NONE, | ||
134 | List.of(instanceParameter), null, null, List.of()); | ||
135 | this.relations.put(enumDeclaration, info); | ||
136 | } | ||
137 | |||
138 | private void collectOwnNodes(Problem problem) { | ||
139 | for (var statement : problem.getStatements()) { | ||
140 | if (statement instanceof IndividualDeclaration individualDeclaration) { | ||
141 | collectIndividuals(individualDeclaration); | ||
142 | } else if (statement instanceof ClassDeclaration classDeclaration) { | ||
143 | collectNewNode(classDeclaration); | ||
144 | } else if (statement instanceof EnumDeclaration enumDeclaration) { | ||
145 | collectEnumLiterals(enumDeclaration); | ||
146 | } | ||
147 | } | ||
148 | for (var node : problem.getNodes()) { | ||
149 | addNode(node, false); | ||
150 | } | ||
151 | } | ||
152 | |||
153 | private void collectIndividuals(IndividualDeclaration individualDeclaration) { | ||
154 | for (var individual : individualDeclaration.getNodes()) { | ||
155 | addNode(individual, true); | ||
156 | } | ||
157 | } | ||
158 | |||
159 | private void collectNewNode(ClassDeclaration classDeclaration) { | ||
160 | var newNode = classDeclaration.getNewNode(); | ||
161 | if (newNode != null) { | ||
162 | addNode(newNode, false); | ||
163 | } | ||
164 | } | ||
165 | |||
166 | private void collectEnumLiterals(EnumDeclaration enumDeclaration) { | ||
167 | for (var literal : enumDeclaration.getLiterals()) { | ||
168 | addNode(literal, true); | ||
169 | } | ||
170 | } | ||
171 | |||
172 | private void addNode(Node node, boolean individual) { | ||
173 | var info = new NodeInfo(getQualifiedNameString(node), individual); | ||
174 | this.nodes.put(node, info); | ||
175 | } | ||
176 | |||
177 | private String getQualifiedNameString(EObject eObject) { | ||
178 | var qualifiedName = qualifiedNameProvider.getFullyQualifiedName(eObject); | ||
179 | if (qualifiedName == null) { | ||
180 | return null; | ||
181 | } | ||
182 | return qualifiedNameConverter.toString(qualifiedName); | ||
183 | } | ||
184 | |||
185 | private void collectOwnAssertions(Problem problem) { | ||
186 | for (var statement : problem.getStatements()) { | ||
187 | if (statement instanceof Assertion assertion) { | ||
188 | collectAssertion(assertion); | ||
189 | } else if (statement instanceof PredicateDefinition predicateDefinition) { | ||
190 | collectPredicateAssertion(predicateDefinition); | ||
191 | } else if (statement instanceof ClassDeclaration classDeclaration) { | ||
192 | collectClassAssertion(classDeclaration); | ||
193 | } else if (statement instanceof EnumDeclaration enumDeclaration) { | ||
194 | collectEnumAssertions(enumDeclaration); | ||
195 | } | ||
196 | } | ||
197 | } | ||
198 | |||
199 | private void collectAssertion(Assertion assertion) { | ||
200 | var relationInfo = this.relations.get(assertion.getRelation()); | ||
201 | if (relationInfo == null) { | ||
202 | throw new IllegalStateException("Assertion refers to unknown relation"); | ||
203 | } | ||
204 | if (assertion.getArguments().size() != relationInfo.parameters().size()) { | ||
205 | // Silently ignoring assertions of invalid arity helps when SymbolCollector is called on an invalid | ||
206 | // Problem during editing. The errors can still be detected by the Problem validator. | ||
207 | return; | ||
208 | } | ||
209 | relationInfo.assertions().add(assertion); | ||
210 | } | ||
211 | |||
212 | private void collectPredicateAssertion(PredicateDefinition predicateDefinition) { | ||
213 | if (predicateDefinition.getKind() != PredicateKind.ERROR) { | ||
214 | return; | ||
215 | } | ||
216 | int arity = predicateDefinition.getParameters().size(); | ||
217 | addAssertion(predicateDefinition, LogicValue.FALSE, new Node[arity]); | ||
218 | } | ||
219 | |||
220 | private void collectClassAssertion(ClassDeclaration classDeclaration) { | ||
221 | var node = classDeclaration.getNewNode(); | ||
222 | if (node == null) { | ||
223 | return; | ||
224 | } | ||
225 | addAssertion(classDeclaration, LogicValue.TRUE, node); | ||
226 | addAssertion(builtinSymbols.exists(), LogicValue.UNKNOWN, node); | ||
227 | addAssertion(builtinSymbols.equals(), LogicValue.UNKNOWN, node, node); | ||
228 | } | ||
229 | |||
230 | private void collectEnumAssertions(EnumDeclaration enumDeclaration) { | ||
231 | for (var literal : enumDeclaration.getLiterals()) { | ||
232 | addAssertion(enumDeclaration, LogicValue.TRUE, literal); | ||
233 | } | ||
234 | } | ||
235 | |||
236 | private void addAssertion(Relation relation, LogicValue logicValue, Node... nodes) { | ||
237 | var assertion = ProblemFactory.eINSTANCE.createAssertion(); | ||
238 | assertion.setRelation(relation); | ||
239 | for (var node : nodes) { | ||
240 | AssertionArgument argument; | ||
241 | if (node == null) { | ||
242 | argument = ProblemFactory.eINSTANCE.createWildcardAssertionArgument(); | ||
243 | } else { | ||
244 | var nodeArgument = ProblemFactory.eINSTANCE.createNodeAssertionArgument(); | ||
245 | nodeArgument.setNode(node); | ||
246 | argument = nodeArgument; | ||
247 | } | ||
248 | assertion.getArguments().add(argument); | ||
249 | } | ||
250 | var value = ProblemFactory.eINSTANCE.createLogicConstant(); | ||
251 | value.setLogicValue(logicValue); | ||
252 | assertion.setValue(value); | ||
253 | collectAssertion(assertion); | ||
254 | } | ||
255 | } | ||
diff --git a/subprojects/language/src/main/resources/tools/refinery/language/builtin.problem b/subprojects/language/src/main/resources/tools/refinery/language/builtin.problem index 9c1d7669..8570e363 100644 --- a/subprojects/language/src/main/resources/tools/refinery/language/builtin.problem +++ b/subprojects/language/src/main/resources/tools/refinery/language/builtin.problem | |||
@@ -3,43 +3,14 @@ | |||
3 | % SPDX-License-Identifier: EPL-2.0 | 3 | % SPDX-License-Identifier: EPL-2.0 |
4 | problem builtin. | 4 | problem builtin. |
5 | 5 | ||
6 | abstract class node { | 6 | abstract class node. |
7 | refers node[] equals opposite equals | ||
8 | } | ||
9 | 7 | ||
10 | pred exists(node node). | 8 | pred exists(node). |
11 | 9 | ||
12 | % class Integer { | 10 | pred equals(left, right). |
13 | % int intValue | ||
14 | % } | ||
15 | % | ||
16 | % class Real { | ||
17 | % real realValue | ||
18 | % } | ||
19 | % | ||
20 | % class String { | ||
21 | % string stringValue | ||
22 | % } | ||
23 | % | ||
24 | % enum Boolean { | ||
25 | % TRUE, FALSE | ||
26 | % } | ||
27 | 11 | ||
28 | pred contained(node node). | 12 | abstract class contained extends node. |
29 | 13 | ||
30 | pred contains(node container, node contained). | 14 | pred contains(container, contained contained). |
31 | 15 | ||
32 | pred root(node node). | 16 | error invalidNumberOfContainers(contained contained). |
33 | |||
34 | % error missingContainer(contained node) <-> | ||
35 | % !contains(node, _), !root(node). | ||
36 | % | ||
37 | % error tooManyContainers(contained node) <-> | ||
38 | % #contains(_, node) > 1 | ||
39 | % ; | ||
40 | % contains(_, node), root(node) | ||
41 | % ; | ||
42 | % contains(_, node), !contained(node). | ||
43 | % | ||
44 | % error containmentCycle(node node) <-> | ||
45 | % contains+(node, node). | ||
diff --git a/subprojects/language/src/test/java/tools/refinery/language/tests/ProblemParsingTest.java b/subprojects/language/src/test/java/tools/refinery/language/tests/ProblemParsingTest.java index c7952369..96e7cf9c 100644 --- a/subprojects/language/src/test/java/tools/refinery/language/tests/ProblemParsingTest.java +++ b/subprojects/language/src/test/java/tools/refinery/language/tests/ProblemParsingTest.java | |||
@@ -31,7 +31,6 @@ class ProblemParsingTest { | |||
31 | class Person { | 31 | class Person { |
32 | Person[0..*] children opposite parent | 32 | Person[0..*] children opposite parent |
33 | Person[0..1] parent opposite children | 33 | Person[0..1] parent opposite children |
34 | int age | ||
35 | TaxStatus taxStatus | 34 | TaxStatus taxStatus |
36 | } | 35 | } |
37 | 36 | ||
@@ -51,8 +50,6 @@ class ProblemParsingTest { | |||
51 | children(anne, ciri). | 50 | children(anne, ciri). |
52 | ?children(bob, ciri). | 51 | ?children(bob, ciri). |
53 | taxStatus(anne, ADULT). | 52 | taxStatus(anne, ADULT). |
54 | age(bob): 21..35. | ||
55 | age(ciri): 10. | ||
56 | """); | 53 | """); |
57 | assertThat(problem.errors(), empty()); | 54 | assertThat(problem.errors(), empty()); |
58 | } | 55 | } |
diff --git a/subprojects/language/src/test/java/tools/refinery/language/tests/parser/antlr/TransitiveClosureParserTest.java b/subprojects/language/src/test/java/tools/refinery/language/tests/parser/antlr/TransitiveClosureParserTest.java index 1180d131..ed193e90 100644 --- a/subprojects/language/src/test/java/tools/refinery/language/tests/parser/antlr/TransitiveClosureParserTest.java +++ b/subprojects/language/src/test/java/tools/refinery/language/tests/parser/antlr/TransitiveClosureParserTest.java | |||
@@ -29,9 +29,7 @@ class TransitiveClosureParserTest { | |||
29 | @Test | 29 | @Test |
30 | void binaryAddOperatorTest() { | 30 | void binaryAddOperatorTest() { |
31 | var problem = parseHelper.parse(""" | 31 | var problem = parseHelper.parse(""" |
32 | fn int a(). | 32 | pred foo(a, b) <-> a + (b) > 10. |
33 | fn int b(). | ||
34 | pred foo() <-> a() + (b()) > 10. | ||
35 | """); | 33 | """); |
36 | assertThat(problem.errors(), empty()); | 34 | assertThat(problem.errors(), empty()); |
37 | var literal = problem.pred("foo").conj(0).lit(0).get(); | 35 | var literal = problem.pred("foo").conj(0).lit(0).get(); |
diff --git a/subprojects/language/src/test/java/tools/refinery/language/tests/serializer/ProblemSerializerTest.java b/subprojects/language/src/test/java/tools/refinery/language/tests/serializer/ProblemSerializerTest.java index 3f3a081f..9f4f2bbf 100644 --- a/subprojects/language/src/test/java/tools/refinery/language/tests/serializer/ProblemSerializerTest.java +++ b/subprojects/language/src/test/java/tools/refinery/language/tests/serializer/ProblemSerializerTest.java | |||
@@ -178,7 +178,7 @@ class ProblemSerializerTest { | |||
178 | var variable = ProblemFactory.eINSTANCE.createImplicitVariable(); | 178 | var variable = ProblemFactory.eINSTANCE.createImplicitVariable(); |
179 | variable.setName("q"); | 179 | variable.setName("q"); |
180 | conjunction.getImplicitVariables().add(variable); | 180 | conjunction.getImplicitVariables().add(variable); |
181 | var equals = nodeType.feature("equals"); | 181 | var equals = builtin.pred("equals").get(); |
182 | conjunction.getLiterals().add(createAtom(equals, parameter1, variable)); | 182 | conjunction.getLiterals().add(createAtom(equals, parameter1, variable)); |
183 | conjunction.getLiterals().add(createAtom(equals, variable, parameter2)); | 183 | conjunction.getLiterals().add(createAtom(equals, variable, parameter2)); |
184 | pred.getBodies().add(conjunction); | 184 | pred.getBodies().add(conjunction); |
@@ -212,7 +212,7 @@ class ProblemSerializerTest { | |||
212 | pred.getParameters().add(parameter); | 212 | pred.getParameters().add(parameter); |
213 | var conjunction = ProblemFactory.eINSTANCE.createConjunction(); | 213 | var conjunction = ProblemFactory.eINSTANCE.createConjunction(); |
214 | var atom = ProblemFactory.eINSTANCE.createAtom(); | 214 | var atom = ProblemFactory.eINSTANCE.createAtom(); |
215 | var equals = nodeType.feature("equals"); | 215 | var equals = builtin.pred("equals").get(); |
216 | atom.setRelation(equals); | 216 | atom.setRelation(equals); |
217 | var arg1 = ProblemFactory.eINSTANCE.createVariableOrNodeExpr(); | 217 | var arg1 = ProblemFactory.eINSTANCE.createVariableOrNodeExpr(); |
218 | arg1.setVariableOrNode(parameter); | 218 | arg1.setVariableOrNode(parameter); |
diff --git a/subprojects/language/src/test/java/tools/refinery/language/tests/utils/SymbolCollectorTest.java b/subprojects/language/src/test/java/tools/refinery/language/tests/utils/SymbolCollectorTest.java deleted file mode 100644 index d200eeff..00000000 --- a/subprojects/language/src/test/java/tools/refinery/language/tests/utils/SymbolCollectorTest.java +++ /dev/null | |||
@@ -1,243 +0,0 @@ | |||
1 | /* | ||
2 | * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> | ||
3 | * | ||
4 | * SPDX-License-Identifier: EPL-2.0 | ||
5 | */ | ||
6 | package tools.refinery.language.tests.utils; | ||
7 | |||
8 | import com.google.inject.Inject; | ||
9 | import org.eclipse.xtext.testing.InjectWith; | ||
10 | import org.eclipse.xtext.testing.extensions.InjectionExtension; | ||
11 | import org.hamcrest.Matcher; | ||
12 | import org.junit.jupiter.api.Disabled; | ||
13 | import org.junit.jupiter.api.Test; | ||
14 | import org.junit.jupiter.api.extension.ExtendWith; | ||
15 | import org.junit.jupiter.params.ParameterizedTest; | ||
16 | import org.junit.jupiter.params.provider.Arguments; | ||
17 | import org.junit.jupiter.params.provider.MethodSource; | ||
18 | import tools.refinery.language.model.problem.*; | ||
19 | import tools.refinery.language.model.tests.utils.ProblemParseHelper; | ||
20 | import tools.refinery.language.tests.ProblemInjectorProvider; | ||
21 | import tools.refinery.language.utils.ContainmentRole; | ||
22 | import tools.refinery.language.utils.ProblemDesugarer; | ||
23 | |||
24 | import java.util.stream.Stream; | ||
25 | |||
26 | import static org.hamcrest.MatcherAssert.assertThat; | ||
27 | import static org.hamcrest.Matchers.*; | ||
28 | import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; | ||
29 | |||
30 | @ExtendWith(InjectionExtension.class) | ||
31 | @InjectWith(ProblemInjectorProvider.class) | ||
32 | class SymbolCollectorTest { | ||
33 | @Inject | ||
34 | private ProblemParseHelper parseHelper; | ||
35 | |||
36 | @Inject | ||
37 | private ProblemDesugarer desugarer; | ||
38 | |||
39 | @Test | ||
40 | void implicitNodeTest() { | ||
41 | var problem = parseHelper.parse(""" | ||
42 | exists(a). | ||
43 | """); | ||
44 | var collectedSymbols = desugarer.collectSymbols(problem.get()); | ||
45 | var node = problem.node("a"); | ||
46 | assertThat(collectedSymbols.nodes(), hasKey(node)); | ||
47 | assertThat(collectedSymbols.nodes().get(node).individual(), is(false)); | ||
48 | } | ||
49 | |||
50 | @Test | ||
51 | void individualNodeTest() { | ||
52 | var problem = parseHelper.parse(""" | ||
53 | indiv a. | ||
54 | """); | ||
55 | var collectedSymbols = desugarer.collectSymbols(problem.get()); | ||
56 | var node = problem.individualNode("a"); | ||
57 | assertThat(collectedSymbols.nodes(), hasKey(node)); | ||
58 | assertThat(collectedSymbols.nodes().get(node).individual(), is(true)); | ||
59 | } | ||
60 | |||
61 | @Test | ||
62 | void classTest() { | ||
63 | var problem = parseHelper.parse(""" | ||
64 | class Foo. | ||
65 | """); | ||
66 | var collectedSymbols = desugarer.collectSymbols(problem.get()); | ||
67 | var classDeclaration = problem.findClass("Foo").get(); | ||
68 | assertThat(collectedSymbols.relations(), hasKey(classDeclaration)); | ||
69 | var classInfo = collectedSymbols.relations().get(classDeclaration); | ||
70 | assertThat(classInfo.parameters(), hasSize(1)); | ||
71 | assertThat(classInfo.containmentRole(), is(ContainmentRole.CONTAINED)); | ||
72 | assertThat(classInfo.hasDefinition(), is(false)); | ||
73 | var newNode = classDeclaration.getNewNode(); | ||
74 | assertThat(collectedSymbols.nodes(), hasKey(newNode)); | ||
75 | assertThat(collectedSymbols.nodes().get(newNode).individual(), is(false)); | ||
76 | assertThat(classInfo.assertions(), assertsNode(newNode, LogicValue.TRUE)); | ||
77 | assertThat(collectedSymbols.relations().get(problem.builtinSymbols().exists()).assertions(), | ||
78 | assertsNode(newNode, LogicValue.UNKNOWN)); | ||
79 | assertThat(collectedSymbols.relations().get(problem.builtinSymbols().equals()).assertions(), | ||
80 | assertsNode(newNode, LogicValue.UNKNOWN)); | ||
81 | } | ||
82 | |||
83 | @Test | ||
84 | void abstractClassTest() { | ||
85 | var problem = parseHelper.parse(""" | ||
86 | abstract class Foo. | ||
87 | """); | ||
88 | var collectedSymbols = desugarer.collectSymbols(problem.get()); | ||
89 | assertThat(collectedSymbols.relations().get(problem.findClass("Foo").get()).assertions(), hasSize(0)); | ||
90 | } | ||
91 | |||
92 | @Test | ||
93 | void referenceTest() { | ||
94 | var problem = parseHelper.parse(""" | ||
95 | class Foo { | ||
96 | refers Foo[] bar opposite quux | ||
97 | refers Foo quux opposite bar | ||
98 | } | ||
99 | """); | ||
100 | var collectedSymbols = desugarer.collectSymbols(problem.get()); | ||
101 | var fooClass = problem.findClass("Foo"); | ||
102 | var barReference = fooClass.feature("bar"); | ||
103 | var barInfo = collectedSymbols.relations().get(barReference); | ||
104 | var quuxReference = fooClass.feature("quux"); | ||
105 | var quuxInfo = collectedSymbols.relations().get(quuxReference); | ||
106 | assertThat(barInfo.containmentRole(), is(ContainmentRole.NONE)); | ||
107 | assertThat(barInfo.opposite(), is(quuxReference)); | ||
108 | assertThat(barInfo.multiplicity(), is(instanceOf(UnboundedMultiplicity.class))); | ||
109 | assertThat(barInfo.hasDefinition(), is(false)); | ||
110 | assertThat(quuxInfo.containmentRole(), is(ContainmentRole.NONE)); | ||
111 | assertThat(quuxInfo.opposite(), is(barReference)); | ||
112 | assertThat(quuxInfo.multiplicity(), is(instanceOf(ExactMultiplicity.class))); | ||
113 | assertThat(quuxInfo.multiplicity(), hasProperty("exactValue", is(1))); | ||
114 | assertThat(quuxInfo.hasDefinition(), is(false)); | ||
115 | } | ||
116 | |||
117 | @Test | ||
118 | void containmentReferenceTest() { | ||
119 | var problem = parseHelper.parse(""" | ||
120 | class Foo { | ||
121 | contains Foo[] bar | ||
122 | } | ||
123 | """); | ||
124 | var collectedSymbols = desugarer.collectSymbols(problem.get()); | ||
125 | assertThat(collectedSymbols.relations().get(problem.findClass("Foo").feature("bar")).containmentRole(), | ||
126 | is(ContainmentRole.CONTAINMENT)); | ||
127 | } | ||
128 | |||
129 | @Disabled("TODO: Rework numerical references") | ||
130 | @Test | ||
131 | void dataReferenceTest() { | ||
132 | var problem = parseHelper.parse(""" | ||
133 | class Foo { | ||
134 | int bar | ||
135 | } | ||
136 | """); | ||
137 | var collectedSymbols = desugarer.collectSymbols(problem.get()); | ||
138 | assertThat(collectedSymbols.relations().get(problem.findClass("Foo").feature("bar")).containmentRole(), | ||
139 | is(ContainmentRole.CONTAINMENT)); | ||
140 | } | ||
141 | |||
142 | @Test | ||
143 | void enumTest() { | ||
144 | var problem = parseHelper.parse(""" | ||
145 | enum Foo { | ||
146 | bar, quux | ||
147 | } | ||
148 | """); | ||
149 | var collectedSymbols = desugarer.collectSymbols(problem.get()); | ||
150 | var enumDeclaration = problem.findEnum("Foo"); | ||
151 | var enumInfo = collectedSymbols.relations().get(enumDeclaration.get()); | ||
152 | assertThat(enumInfo.containmentRole(), is(ContainmentRole.NONE)); | ||
153 | assertThat(enumInfo.assertions(), assertsNode(enumDeclaration.literal("bar"), LogicValue.TRUE)); | ||
154 | assertThat(enumInfo.assertions(), assertsNode(enumDeclaration.literal("quux"), LogicValue.TRUE)); | ||
155 | } | ||
156 | |||
157 | @ParameterizedTest | ||
158 | @MethodSource | ||
159 | void predicateTest(String keyword, ContainmentRole containmentRole) { | ||
160 | var problem = parseHelper.parse(keyword + " foo(node x) <-> domain(x); data(x)."); | ||
161 | var collectedSymbols = desugarer.collectSymbols(problem.get()); | ||
162 | var predicateInfo = collectedSymbols.relations().get(problem.pred("foo").get()); | ||
163 | assertThat(predicateInfo.containmentRole(), is(containmentRole)); | ||
164 | assertThat(predicateInfo.parameters(), hasSize(1)); | ||
165 | assertThat(predicateInfo.bodies(), hasSize(2)); | ||
166 | assertThat(predicateInfo.hasDefinition(), is(true)); | ||
167 | } | ||
168 | |||
169 | static Stream<Arguments> predicateTest() { | ||
170 | return Stream.of(Arguments.of("pred", ContainmentRole.NONE), Arguments.of("error", ContainmentRole.NONE), | ||
171 | Arguments.of("contained pred", ContainmentRole.CONTAINED), Arguments.of("containment pred", | ||
172 | ContainmentRole.CONTAINMENT)); | ||
173 | } | ||
174 | |||
175 | @ParameterizedTest | ||
176 | @MethodSource("logicValues") | ||
177 | void assertionTest(String keyword, LogicValue value) { | ||
178 | var problem = parseHelper.parse(""" | ||
179 | pred foo(node x). | ||
180 | foo(a): %s. | ||
181 | """.formatted(keyword)); | ||
182 | var collectedSymbols = desugarer.collectSymbols(problem.get()); | ||
183 | assertThat(collectedSymbols.relations().get(problem.pred("foo").get()).assertions(), | ||
184 | assertsNode(problem.node("a"), value)); | ||
185 | } | ||
186 | |||
187 | @ParameterizedTest | ||
188 | @MethodSource("logicValues") | ||
189 | void defaultAssertionTest(String keyword, LogicValue value) { | ||
190 | var problem = parseHelper.parse(""" | ||
191 | pred foo(node x). | ||
192 | default foo(a): %s. | ||
193 | """.formatted(keyword)); | ||
194 | var collectedSymbols = desugarer.collectSymbols(problem.get()); | ||
195 | assertThat(collectedSymbols.relations().get(problem.pred("foo").get()).assertions(), | ||
196 | assertsNode(problem.node("a"), value)); | ||
197 | } | ||
198 | |||
199 | static Stream<Arguments> logicValues() { | ||
200 | return Stream.of(Arguments.of("true", LogicValue.TRUE), Arguments.of("false", LogicValue.FALSE), | ||
201 | Arguments.of("unknown", LogicValue.UNKNOWN), Arguments.of("error", LogicValue.ERROR)); | ||
202 | } | ||
203 | |||
204 | @Test | ||
205 | void invalidAssertionArityTest() { | ||
206 | var problem = parseHelper.parse(""" | ||
207 | pred foo(node x). | ||
208 | foo(a, b). | ||
209 | """); | ||
210 | var collectedSymbols = desugarer.collectSymbols(problem.get()); | ||
211 | assertThat(collectedSymbols.relations().get(problem.pred("foo").get()).assertions(), hasSize(0)); | ||
212 | } | ||
213 | |||
214 | @Test | ||
215 | void invalidProblemTest() { | ||
216 | var problem = parseHelper.parse(""" | ||
217 | class Foo { | ||
218 | bar[] opposite quux | ||
219 | Foo quux opposite bar | ||
220 | } | ||
221 | """).get(); | ||
222 | assertDoesNotThrow(() -> desugarer.collectSymbols(problem)); | ||
223 | } | ||
224 | |||
225 | @Test | ||
226 | void errorAssertionTest() { | ||
227 | var problem = parseHelper.parse(""" | ||
228 | error foo(node a, node b) <-> equals(a, b). | ||
229 | """); | ||
230 | var collectedSymbols = desugarer.collectSymbols(problem.get()); | ||
231 | var fooInfo = collectedSymbols.relations().get(problem.pred("foo").get()); | ||
232 | assertThat(fooInfo.assertions(), hasSize(1)); | ||
233 | var assertion = fooInfo.assertions().stream().findFirst().orElseThrow(); | ||
234 | assertThat(assertion.getValue(), hasProperty("logicValue", is(LogicValue.FALSE))); | ||
235 | assertThat(assertion.getArguments(), hasSize(2)); | ||
236 | assertThat(assertion.getArguments(), everyItem(instanceOf(WildcardAssertionArgument.class))); | ||
237 | } | ||
238 | |||
239 | private static Matcher<Iterable<? super Assertion>> assertsNode(Node node, LogicValue value) { | ||
240 | return hasItem(allOf(hasProperty("arguments", hasItem(hasProperty("node", is(node)))), hasProperty("value", | ||
241 | hasProperty("logicValue", is(value))))); | ||
242 | } | ||
243 | } | ||