aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--language-ide/src/main/java/org/eclipse/viatra/solver/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java6
-rw-r--r--language-model/problem.aird203
-rw-r--r--language-model/src/main/resources/model/problem.ecore8
-rw-r--r--language-model/src/main/resources/model/problem.genmodel6
-rw-r--r--language-mwe2/src/main/java/org/eclipse/viatra/solver/language/mwe2/ProblemWebIntegrationFragment.java7
-rw-r--r--language-web/src/main/css/index.scss2
-rw-r--r--language-web/src/main/js/index.jsx12
-rw-r--r--language/src/main/java/org/eclipse/viatra/solver/language/Problem.xtext32
-rw-r--r--language/src/main/java/org/eclipse/viatra/solver/language/ProblemUtil.java11
-rw-r--r--language/src/main/java/org/eclipse/viatra/solver/language/naming/NamingUtil.java10
-rw-r--r--language/src/main/java/org/eclipse/viatra/solver/language/resource/NodeNameCollector.java47
-rw-r--r--language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemLocationInFileProvider.java2
-rw-r--r--language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemResourceDescriptionStrategy.java3
-rw-r--r--language/src/test/java/org/eclipse/viatra/solver/language/tests/ProblemTestUtil.xtend5
-rw-r--r--language/src/test/java/org/eclipse/viatra/solver/language/tests/scoping/NodeScopingTest.xtend80
15 files changed, 284 insertions, 150 deletions
diff --git a/language-ide/src/main/java/org/eclipse/viatra/solver/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java b/language-ide/src/main/java/org/eclipse/viatra/solver/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
index b1a69e9d..f9a1fb7b 100644
--- a/language-ide/src/main/java/org/eclipse/viatra/solver/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
+++ b/language-ide/src/main/java/org/eclipse/viatra/solver/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
@@ -35,7 +35,7 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli
35 private static final String PREDICATE_CLASS = "problem-predicate"; 35 private static final String PREDICATE_CLASS = "problem-predicate";
36 private static final String ERROR_CLASS = "problem-error"; 36 private static final String ERROR_CLASS = "problem-error";
37 private static final String NODE_CLASS = "problem-node"; 37 private static final String NODE_CLASS = "problem-node";
38 private static final String ENUM_NODE_CLASS = "problem-enum-node"; 38 private static final String UNIQUE_NODE_CLASS = "problem-unique-node";
39 private static final String NEW_NODE_CLASS = "problem-new-node"; 39 private static final String NEW_NODE_CLASS = "problem-new-node";
40 private static final String PARAMETER_CLASS = "problem-parameter"; 40 private static final String PARAMETER_CLASS = "problem-parameter";
41 private static final String VARIABLE_CLASS = "problem-variable"; 41 private static final String VARIABLE_CLASS = "problem-variable";
@@ -132,8 +132,8 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli
132 if (eObject instanceof Node) { 132 if (eObject instanceof Node) {
133 classesBuilder.add(NODE_CLASS); 133 classesBuilder.add(NODE_CLASS);
134 var node = (Node) eObject; 134 var node = (Node) eObject;
135 if (ProblemUtil.isEnumNode(node)) { 135 if (ProblemUtil.isUniqueNode(node)) {
136 classesBuilder.add(ENUM_NODE_CLASS); 136 classesBuilder.add(UNIQUE_NODE_CLASS);
137 } 137 }
138 if (ProblemUtil.isNewNode(node)) { 138 if (ProblemUtil.isNewNode(node)) {
139 classesBuilder.add(NEW_NODE_CLASS); 139 classesBuilder.add(NEW_NODE_CLASS);
diff --git a/language-model/problem.aird b/language-model/problem.aird
index 1339af12..f2192e65 100644
--- a/language-model/problem.aird
+++ b/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="problem" repPath="#_CsUwgKA4EeuqkpDnuik1sg" changeId="9e6149a4-5a12-44f9-8e40-b3da58c59eb4"> 10 <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_CsYa4KA4EeuqkpDnuik1sg" name="problem" repPath="#_CsUwgKA4EeuqkpDnuik1sg" changeId="06203da9-3aa0-4459-90ab-809823eee3f6">
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>
@@ -169,11 +169,15 @@
169 <styles xmi:type="notation:FontStyle" xmi:id="_NAri8aA9EeuqkpDnuik1sg" fontColor="2697711" fontName="Noto Sans" fontHeight="8"/> 169 <styles xmi:type="notation:FontStyle" xmi:id="_NAri8aA9EeuqkpDnuik1sg" fontColor="2697711" fontName="Noto Sans" fontHeight="8"/>
170 <layoutConstraint xmi:type="notation:Location" xmi:id="_NAri8qA9EeuqkpDnuik1sg"/> 170 <layoutConstraint xmi:type="notation:Location" xmi:id="_NAri8qA9EeuqkpDnuik1sg"/>
171 </children> 171 </children>
172 <children xmi:type="notation:Node" xmi:id="_Y3GDAAGzEey7cfH5K6RyCw" type="3010" element="_Y2m60AGzEey7cfH5K6RyCw">
173 <styles xmi:type="notation:FontStyle" xmi:id="_Y3GDAQGzEey7cfH5K6RyCw" fontColor="2697711" fontName="Noto Sans" fontHeight="8"/>
174 <layoutConstraint xmi:type="notation:Location" xmi:id="_Y3GDAgGzEey7cfH5K6RyCw"/>
175 </children>
172 <styles xmi:type="notation:SortingStyle" xmi:id="_p9xZ0qA8EeuqkpDnuik1sg"/> 176 <styles xmi:type="notation:SortingStyle" xmi:id="_p9xZ0qA8EeuqkpDnuik1sg"/>
173 <styles xmi:type="notation:FilteringStyle" xmi:id="_p9xZ06A8EeuqkpDnuik1sg"/> 177 <styles xmi:type="notation:FilteringStyle" xmi:id="_p9xZ06A8EeuqkpDnuik1sg"/>
174 </children> 178 </children>
175 <styles xmi:type="notation:ShapeStyle" xmi:id="_p9wywaA8EeuqkpDnuik1sg" fontName="Noto Sans" fontHeight="8"/> 179 <styles xmi:type="notation:ShapeStyle" xmi:id="_p9wywaA8EeuqkpDnuik1sg" fontName="Noto Sans" fontHeight="8"/>
176 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_p9wywqA8EeuqkpDnuik1sg" x="1872" y="528" width="120" height="100"/> 180 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_p9wywqA8EeuqkpDnuik1sg" x="1872" y="528" width="120" height="111"/>
177 </children> 181 </children>
178 <children xmi:type="notation:Node" xmi:id="_xsq_MKA8EeuqkpDnuik1sg" type="2003" element="_xsYrUKA8EeuqkpDnuik1sg"> 182 <children xmi:type="notation:Node" xmi:id="_xsq_MKA8EeuqkpDnuik1sg" type="2003" element="_xsYrUKA8EeuqkpDnuik1sg">
179 <children xmi:type="notation:Node" xmi:id="_xsrmQKA8EeuqkpDnuik1sg" type="5007"/> 183 <children xmi:type="notation:Node" xmi:id="_xsrmQKA8EeuqkpDnuik1sg" type="5007"/>
@@ -199,6 +203,10 @@
199 <styles xmi:type="notation:FontStyle" xmi:id="_JW_fcaA9EeuqkpDnuik1sg" fontName="Noto Sans" fontHeight="8"/> 203 <styles xmi:type="notation:FontStyle" xmi:id="_JW_fcaA9EeuqkpDnuik1sg" fontName="Noto Sans" fontHeight="8"/>
200 <layoutConstraint xmi:type="notation:Location" xmi:id="_JW_fcqA9EeuqkpDnuik1sg"/> 204 <layoutConstraint xmi:type="notation:Location" xmi:id="_JW_fcqA9EeuqkpDnuik1sg"/>
201 </children> 205 </children>
206 <children xmi:type="notation:Node" xmi:id="_9LOjcAGzEey7cfH5K6RyCw" type="3010" element="_9K7BcAGzEey7cfH5K6RyCw">
207 <styles xmi:type="notation:FontStyle" xmi:id="_9LOjcQGzEey7cfH5K6RyCw" fontName="Noto Sans" fontHeight="8"/>
208 <layoutConstraint xmi:type="notation:Location" xmi:id="_9LOjcgGzEey7cfH5K6RyCw"/>
209 </children>
202 <styles xmi:type="notation:SortingStyle" xmi:id="_BMfjNaA9EeuqkpDnuik1sg"/> 210 <styles xmi:type="notation:SortingStyle" xmi:id="_BMfjNaA9EeuqkpDnuik1sg"/>
203 <styles xmi:type="notation:FilteringStyle" xmi:id="_BMfjNqA9EeuqkpDnuik1sg"/> 211 <styles xmi:type="notation:FilteringStyle" xmi:id="_BMfjNqA9EeuqkpDnuik1sg"/>
204 </children> 212 </children>
@@ -413,6 +421,24 @@
413 <styles xmi:type="notation:ShapeStyle" xmi:id="_9Tu6EdeAEeufiOvRR5sVhg" fontName="Noto Sans" fontHeight="8"/> 421 <styles xmi:type="notation:ShapeStyle" xmi:id="_9Tu6EdeAEeufiOvRR5sVhg" fontName="Noto Sans" fontHeight="8"/>
414 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_9Tu6EteAEeufiOvRR5sVhg" x="2136" y="528" width="144" height="100"/> 422 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_9Tu6EteAEeufiOvRR5sVhg" x="2136" y="528" width="144" height="100"/>
415 </children> 423 </children>
424 <children xmi:type="notation:Node" xmi:id="_pdJrwAGyEey7cfH5K6RyCw" type="2003" element="_pcXBkAGyEey7cfH5K6RyCw">
425 <children xmi:type="notation:Node" xmi:id="_pdOkQAGyEey7cfH5K6RyCw" type="5007"/>
426 <children xmi:type="notation:Node" xmi:id="_pdOkQQGyEey7cfH5K6RyCw" type="7004">
427 <styles xmi:type="notation:SortingStyle" xmi:id="_pdOkQgGyEey7cfH5K6RyCw"/>
428 <styles xmi:type="notation:FilteringStyle" xmi:id="_pdOkQwGyEey7cfH5K6RyCw"/>
429 </children>
430 <styles xmi:type="notation:ShapeStyle" xmi:id="_pdJrwQGyEey7cfH5K6RyCw" fontName="Noto Sans" fontHeight="8"/>
431 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_pdJrwgGyEey7cfH5K6RyCw" x="132" y="528" width="120" height="100"/>
432 </children>
433 <children xmi:type="notation:Node" xmi:id="_SNlYYAGzEey7cfH5K6RyCw" type="2003" element="_SNSdcAGzEey7cfH5K6RyCw">
434 <children xmi:type="notation:Node" xmi:id="_SNlYYwGzEey7cfH5K6RyCw" type="5007"/>
435 <children xmi:type="notation:Node" xmi:id="_SNlYZAGzEey7cfH5K6RyCw" type="7004">
436 <styles xmi:type="notation:SortingStyle" xmi:id="_SNlYZQGzEey7cfH5K6RyCw"/>
437 <styles xmi:type="notation:FilteringStyle" xmi:id="_SNlYZgGzEey7cfH5K6RyCw"/>
438 </children>
439 <styles xmi:type="notation:ShapeStyle" xmi:id="_SNlYYQGzEey7cfH5K6RyCw" fontName="Noto Sans" fontHeight="8"/>
440 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_SNlYYgGzEey7cfH5K6RyCw" x="1836" y="840" width="180" height="100"/>
441 </children>
416 <styles xmi:type="notation:DiagramStyle" xmi:id="_CsZB8qA4EeuqkpDnuik1sg"/> 442 <styles xmi:type="notation:DiagramStyle" xmi:id="_CsZB8qA4EeuqkpDnuik1sg"/>
417 <edges xmi:type="notation:Edge" xmi:id="_ODhSQKA4EeuqkpDnuik1sg" type="4001" element="_ODPlcKA4EeuqkpDnuik1sg" source="_JT0o8KA4EeuqkpDnuik1sg" target="_EfWNUKA4EeuqkpDnuik1sg"> 443 <edges xmi:type="notation:Edge" xmi:id="_ODhSQKA4EeuqkpDnuik1sg" type="4001" element="_ODPlcKA4EeuqkpDnuik1sg" source="_JT0o8KA4EeuqkpDnuik1sg" target="_EfWNUKA4EeuqkpDnuik1sg">
418 <children xmi:type="notation:Node" xmi:id="_ODhSRKA4EeuqkpDnuik1sg" type="6001"> 444 <children xmi:type="notation:Node" xmi:id="_ODhSRKA4EeuqkpDnuik1sg" type="6001">
@@ -592,17 +618,17 @@
592 </edges> 618 </edges>
593 <edges xmi:type="notation:Edge" xmi:id="_vWH0AKA7EeuqkpDnuik1sg" type="4001" element="_vWBGaKA7EeuqkpDnuik1sg" source="_sdPX0KA6EeuqkpDnuik1sg" target="_rRhWIKA7EeuqkpDnuik1sg"> 619 <edges xmi:type="notation:Edge" xmi:id="_vWH0AKA7EeuqkpDnuik1sg" type="4001" element="_vWBGaKA7EeuqkpDnuik1sg" source="_sdPX0KA6EeuqkpDnuik1sg" target="_rRhWIKA7EeuqkpDnuik1sg">
594 <children xmi:type="notation:Node" xmi:id="_vWH0BKA7EeuqkpDnuik1sg" type="6001"> 620 <children xmi:type="notation:Node" xmi:id="_vWH0BKA7EeuqkpDnuik1sg" type="6001">
595 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_vWH0BaA7EeuqkpDnuik1sg" x="-105" y="-4"/> 621 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_vWH0BaA7EeuqkpDnuik1sg" x="-32" y="77"/>
596 </children> 622 </children>
597 <children xmi:type="notation:Node" xmi:id="_vWH0BqA7EeuqkpDnuik1sg" type="6002"> 623 <children xmi:type="notation:Node" xmi:id="_vWH0BqA7EeuqkpDnuik1sg" type="6002">
598 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_vWH0B6A7EeuqkpDnuik1sg" y="10"/> 624 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_vWH0B6A7EeuqkpDnuik1sg" y="10"/>
599 </children> 625 </children>
600 <children xmi:type="notation:Node" xmi:id="_vWH0CKA7EeuqkpDnuik1sg" type="6003"> 626 <children xmi:type="notation:Node" xmi:id="_vWH0CKA7EeuqkpDnuik1sg" type="6003">
601 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_vWH0CaA7EeuqkpDnuik1sg" x="-59" y="-55"/> 627 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_vWH0CaA7EeuqkpDnuik1sg" x="47" y="-79"/>
602 </children> 628 </children>
603 <styles xmi:type="notation:ConnectorStyle" xmi:id="_vWH0AaA7EeuqkpDnuik1sg" routing="Tree"/> 629 <styles xmi:type="notation:ConnectorStyle" xmi:id="_vWH0AaA7EeuqkpDnuik1sg" routing="Tree"/>
604 <styles xmi:type="notation:FontStyle" xmi:id="_vWH0AqA7EeuqkpDnuik1sg" fontName="Noto Sans" fontHeight="8"/> 630 <styles xmi:type="notation:FontStyle" xmi:id="_vWH0AqA7EeuqkpDnuik1sg" fontName="Noto Sans" fontHeight="8"/>
605 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_vWH0A6A7EeuqkpDnuik1sg" points="[0, 0, -190, 191]$[0, -48, -190, 143]$[156, -48, -34, 143]$[156, -142, -34, 49]"/> 631 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_vWH0A6A7EeuqkpDnuik1sg" points="[0, 0, -153, 191]$[0, -96, -153, 95]$[107, -96, -46, 95]$[107, -142, -46, 49]"/>
606 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_vWIbEKA7EeuqkpDnuik1sg" id="(0.8135593220338984,0.0)"/> 632 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_vWIbEKA7EeuqkpDnuik1sg" id="(0.8135593220338984,0.0)"/>
607 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_vWIbEaA7EeuqkpDnuik1sg" id="(0.5,0.5)"/> 633 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_vWIbEaA7EeuqkpDnuik1sg" id="(0.5,0.5)"/>
608 </edges> 634 </edges>
@@ -699,7 +725,7 @@
699 <styles xmi:type="notation:ConnectorStyle" xmi:id="_w-zMkaA8EeuqkpDnuik1sg" routing="Rectilinear"/> 725 <styles xmi:type="notation:ConnectorStyle" xmi:id="_w-zMkaA8EeuqkpDnuik1sg" routing="Rectilinear"/>
700 <styles xmi:type="notation:FontStyle" xmi:id="_w-zMkqA8EeuqkpDnuik1sg" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/> 726 <styles xmi:type="notation:FontStyle" xmi:id="_w-zMkqA8EeuqkpDnuik1sg" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/>
701 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_w-zMk6A8EeuqkpDnuik1sg" points="[0, -13, 1130, -13]$[-1130, -13, 0, -13]"/> 727 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_w-zMk6A8EeuqkpDnuik1sg" points="[0, -13, 1130, -13]$[-1130, -13, 0, -13]"/>
702 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_w-zzpKA8EeuqkpDnuik1sg" id="(0.0,0.5)"/> 728 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_w-zzpKA8EeuqkpDnuik1sg" id="(0.0,0.44954128440366975)"/>
703 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_w-zzpaA8EeuqkpDnuik1sg" id="(1.0,0.5)"/> 729 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_w-zzpaA8EeuqkpDnuik1sg" id="(1.0,0.5)"/>
704 </edges> 730 </edges>
705 <edges xmi:type="notation:Edge" xmi:id="_4eaYwKA8EeuqkpDnuik1sg" type="4001" element="_4eU5TqA8EeuqkpDnuik1sg" source="_D1D6MKA4EeuqkpDnuik1sg" target="_xsq_MKA8EeuqkpDnuik1sg"> 731 <edges xmi:type="notation:Edge" xmi:id="_4eaYwKA8EeuqkpDnuik1sg" type="4001" element="_4eU5TqA8EeuqkpDnuik1sg" source="_D1D6MKA4EeuqkpDnuik1sg" target="_xsq_MKA8EeuqkpDnuik1sg">
@@ -736,18 +762,18 @@
736 </edges> 762 </edges>
737 <edges xmi:type="notation:Edge" xmi:id="_mQXegKA9EeuqkpDnuik1sg" type="4001" element="_mQFKsqA9EeuqkpDnuik1sg" source="_p9wywKA8EeuqkpDnuik1sg" target="_e73WIKA9EeuqkpDnuik1sg"> 763 <edges xmi:type="notation:Edge" xmi:id="_mQXegKA9EeuqkpDnuik1sg" type="4001" element="_mQFKsqA9EeuqkpDnuik1sg" source="_p9wywKA8EeuqkpDnuik1sg" target="_e73WIKA9EeuqkpDnuik1sg">
738 <children xmi:type="notation:Node" xmi:id="_mQYFkKA9EeuqkpDnuik1sg" type="6001"> 764 <children xmi:type="notation:Node" xmi:id="_mQYFkKA9EeuqkpDnuik1sg" type="6001">
739 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_mQYFkaA9EeuqkpDnuik1sg" x="-60" y="-10"/> 765 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_mQYFkaA9EeuqkpDnuik1sg" x="-100" y="-10"/>
740 </children> 766 </children>
741 <children xmi:type="notation:Node" xmi:id="_mQYFkqA9EeuqkpDnuik1sg" type="6002"> 767 <children xmi:type="notation:Node" xmi:id="_mQYFkqA9EeuqkpDnuik1sg" type="6002">
742 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_mQYFk6A9EeuqkpDnuik1sg" x="-60" y="10"/> 768 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_mQYFk6A9EeuqkpDnuik1sg" x="-100" y="10"/>
743 </children> 769 </children>
744 <children xmi:type="notation:Node" xmi:id="_mQYFlKA9EeuqkpDnuik1sg" type="6003"> 770 <children xmi:type="notation:Node" xmi:id="_mQYFlKA9EeuqkpDnuik1sg" type="6003">
745 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_mQYFlaA9EeuqkpDnuik1sg" x="-60" y="10"/> 771 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_mQYFlaA9EeuqkpDnuik1sg" x="-100" y="10"/>
746 </children> 772 </children>
747 <styles xmi:type="notation:ConnectorStyle" xmi:id="_mQXegaA9EeuqkpDnuik1sg" routing="Tree"/> 773 <styles xmi:type="notation:ConnectorStyle" xmi:id="_mQXegaA9EeuqkpDnuik1sg" routing="Tree"/>
748 <styles xmi:type="notation:FontStyle" xmi:id="_mQXegqA9EeuqkpDnuik1sg" fontName="Noto Sans" fontHeight="8"/> 774 <styles xmi:type="notation:FontStyle" xmi:id="_mQXegqA9EeuqkpDnuik1sg" fontName="Noto Sans" fontHeight="8"/>
749 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_mQXeg6A9EeuqkpDnuik1sg" points="[0, -5, 1059, 143]$[0, -41, 1059, 107]$[-1058, -41, 1, 107]$[-1058, -99, 1, 49]"/> 775 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_mQXeg6A9EeuqkpDnuik1sg" points="[0, -4, 1065, 143]$[0, -40, 1065, 107]$[-1064, -40, 1, 107]$[-1064, -98, 1, 49]"/>
750 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mQYFlqA9EeuqkpDnuik1sg" id="(0.4745762711864407,0.04081632653061224)"/> 776 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mQYFlqA9EeuqkpDnuik1sg" id="(0.4745762711864407,0.03669724770642201)"/>
751 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mQYFl6A9EeuqkpDnuik1sg" id="(0.5,0.5)"/> 777 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mQYFl6A9EeuqkpDnuik1sg" id="(0.5,0.5)"/>
752 </edges> 778 </edges>
753 <edges xmi:type="notation:Edge" xmi:id="_m0CMQKA9EeuqkpDnuik1sg" type="4001" element="_mzziwKA9EeuqkpDnuik1sg" source="_fit3kKA5EeuqkpDnuik1sg" target="_e73WIKA9EeuqkpDnuik1sg"> 779 <edges xmi:type="notation:Edge" xmi:id="_m0CMQKA9EeuqkpDnuik1sg" type="4001" element="_mzziwKA9EeuqkpDnuik1sg" source="_fit3kKA5EeuqkpDnuik1sg" target="_e73WIKA9EeuqkpDnuik1sg">
@@ -960,17 +986,17 @@
960 </edges> 986 </edges>
961 <edges xmi:type="notation:Edge" xmi:id="_-X6xcNawEeuymriYTNxK2g" type="4001" element="_-XLKltawEeuymriYTNxK2g" source="_JT0o8KA4EeuqkpDnuik1sg" target="_xsq_MKA8EeuqkpDnuik1sg"> 987 <edges xmi:type="notation:Edge" xmi:id="_-X6xcNawEeuymriYTNxK2g" type="4001" element="_-XLKltawEeuymriYTNxK2g" source="_JT0o8KA4EeuqkpDnuik1sg" target="_xsq_MKA8EeuqkpDnuik1sg">
962 <children xmi:type="notation:Node" xmi:id="_-X_C4NawEeuymriYTNxK2g" type="6001"> 988 <children xmi:type="notation:Node" xmi:id="_-X_C4NawEeuymriYTNxK2g" type="6001">
963 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-X_C4dawEeuymriYTNxK2g" x="-2" y="-308"/> 989 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-X_C4dawEeuymriYTNxK2g" x="11" y="-334"/>
964 </children> 990 </children>
965 <children xmi:type="notation:Node" xmi:id="_-X_p8NawEeuymriYTNxK2g" type="6002"> 991 <children xmi:type="notation:Node" xmi:id="_-X_p8NawEeuymriYTNxK2g" type="6002">
966 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-X_p8dawEeuymriYTNxK2g" x="-2" y="10"/> 992 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-X_p8dawEeuymriYTNxK2g" x="-6" y="10"/>
967 </children> 993 </children>
968 <children xmi:type="notation:Node" xmi:id="_-YARANawEeuymriYTNxK2g" type="6003"> 994 <children xmi:type="notation:Node" xmi:id="_-YARANawEeuymriYTNxK2g" type="6003">
969 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-YARAdawEeuymriYTNxK2g" x="-316" y="-140"/> 995 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-YARAdawEeuymriYTNxK2g" x="-312" y="-166"/>
970 </children> 996 </children>
971 <styles xmi:type="notation:ConnectorStyle" xmi:id="_-X6xcdawEeuymriYTNxK2g" routing="Rectilinear"/> 997 <styles xmi:type="notation:ConnectorStyle" xmi:id="_-X6xcdawEeuymriYTNxK2g" routing="Rectilinear"/>
972 <styles xmi:type="notation:FontStyle" xmi:id="_-X6xctawEeuymriYTNxK2g" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/> 998 <styles xmi:type="notation:FontStyle" xmi:id="_-X6xctawEeuymriYTNxK2g" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/>
973 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_-X6xc9awEeuymriYTNxK2g" points="[-58, 86, -288, 422]$[-58, 132, -288, 468]$[288, 132, 58, 468]$[288, -298, 58, 38]"/> 999 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_-X6xc9awEeuymriYTNxK2g" points="[-58, 86, -288, 422]$[-58, 132, -288, 468]$[314, 132, 84, 468]$[314, -298, 84, 38]"/>
974 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_-YCtQNawEeuymriYTNxK2g" id="(1.0,0.12244897959183673)"/> 1000 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_-YCtQNawEeuymriYTNxK2g" id="(1.0,0.12244897959183673)"/>
975 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_-YCtQdawEeuymriYTNxK2g" id="(0.0,0.6122448979591837)"/> 1001 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_-YCtQdawEeuymriYTNxK2g" id="(0.0,0.6122448979591837)"/>
976 </edges> 1002 </edges>
@@ -1056,17 +1082,17 @@
1056 </edges> 1082 </edges>
1057 <edges xmi:type="notation:Edge" xmi:id="_gRXLkNbGEeuymriYTNxK2g" type="4001" element="_gRDCgNbGEeuymriYTNxK2g" source="_M6O-0NbGEeuymriYTNxK2g" target="_xsq_MKA8EeuqkpDnuik1sg"> 1083 <edges xmi:type="notation:Edge" xmi:id="_gRXLkNbGEeuymriYTNxK2g" type="4001" element="_gRDCgNbGEeuymriYTNxK2g" source="_M6O-0NbGEeuymriYTNxK2g" target="_xsq_MKA8EeuqkpDnuik1sg">
1058 <children xmi:type="notation:Node" xmi:id="_gRXLlNbGEeuymriYTNxK2g" type="6001"> 1084 <children xmi:type="notation:Node" xmi:id="_gRXLlNbGEeuymriYTNxK2g" type="6001">
1059 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gRXLldbGEeuymriYTNxK2g" x="-13" y="-41"/> 1085 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gRXLldbGEeuymriYTNxK2g" x="-2" y="-41"/>
1060 </children> 1086 </children>
1061 <children xmi:type="notation:Node" xmi:id="_gRXyoNbGEeuymriYTNxK2g" type="6002"> 1087 <children xmi:type="notation:Node" xmi:id="_gRXyoNbGEeuymriYTNxK2g" type="6002">
1062 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gRXyodbGEeuymriYTNxK2g" x="79" y="10"/> 1088 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gRXyodbGEeuymriYTNxK2g" x="98" y="10"/>
1063 </children> 1089 </children>
1064 <children xmi:type="notation:Node" xmi:id="_gRXyotbGEeuymriYTNxK2g" type="6003"> 1090 <children xmi:type="notation:Node" xmi:id="_gRXyotbGEeuymriYTNxK2g" type="6003">
1065 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gRXyo9bGEeuymriYTNxK2g" x="4" y="10"/> 1091 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gRXyo9bGEeuymriYTNxK2g" x="7" y="10"/>
1066 </children> 1092 </children>
1067 <styles xmi:type="notation:ConnectorStyle" xmi:id="_gRXLkdbGEeuymriYTNxK2g" routing="Rectilinear"/> 1093 <styles xmi:type="notation:ConnectorStyle" xmi:id="_gRXLkdbGEeuymriYTNxK2g" routing="Rectilinear"/>
1068 <styles xmi:type="notation:FontStyle" xmi:id="_gRXLktbGEeuymriYTNxK2g" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/> 1094 <styles xmi:type="notation:FontStyle" xmi:id="_gRXLktbGEeuymriYTNxK2g" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/>
1069 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_gRXLk9bGEeuymriYTNxK2g" points="[25, 48, -35, 334]$[60, 48, 0, 334]$[60, -286, 0, 0]"/> 1095 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_gRXLk9bGEeuymriYTNxK2g" points="[25, 48, -35, 334]$[82, 48, 22, 334]$[82, -286, 22, 0]"/>
1070 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_gRXypNbGEeuymriYTNxK2g" id="(0.788135593220339,0.0)"/> 1096 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_gRXypNbGEeuymriYTNxK2g" id="(0.788135593220339,0.0)"/>
1071 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_gRXypdbGEeuymriYTNxK2g" id="(0.3050847457627119,1.0)"/> 1097 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_gRXypdbGEeuymriYTNxK2g" id="(0.3050847457627119,1.0)"/>
1072 </edges> 1098 </edges>
@@ -1243,7 +1269,7 @@
1243 <styles xmi:type="notation:ConnectorStyle" xmi:id="_YAyoAdeAEeufiOvRR5sVhg" routing="Rectilinear"/> 1269 <styles xmi:type="notation:ConnectorStyle" xmi:id="_YAyoAdeAEeufiOvRR5sVhg" routing="Rectilinear"/>
1244 <styles xmi:type="notation:FontStyle" xmi:id="_YAyoAteAEeufiOvRR5sVhg" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/> 1270 <styles xmi:type="notation:FontStyle" xmi:id="_YAyoAteAEeufiOvRR5sVhg" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/>
1245 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_YAyoA9eAEeufiOvRR5sVhg" points="[0, 0, 0, -82]$[0, 82, 0, 0]"/> 1271 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_YAyoA9eAEeufiOvRR5sVhg" points="[0, 0, 0, -82]$[0, 82, 0, 0]"/>
1246 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_YAzPENeAEeufiOvRR5sVhg" id="(0.4406779661016949,1.0)"/> 1272 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_YAzPENeAEeufiOvRR5sVhg" id="(0.4406779661016949,0.8990825688073395)"/>
1247 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_YAzPEdeAEeufiOvRR5sVhg" id="(0.45112781954887216,0.0)"/> 1273 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_YAzPEdeAEeufiOvRR5sVhg" id="(0.45112781954887216,0.0)"/>
1248 </edges> 1274 </edges>
1249 <edges xmi:type="notation:Edge" xmi:id="_dDz18NeAEeufiOvRR5sVhg" type="4001" element="_dDd3wteAEeufiOvRR5sVhg" source="_OWhiINeAEeufiOvRR5sVhg" target="_VikSENeAEeufiOvRR5sVhg"> 1275 <edges xmi:type="notation:Edge" xmi:id="_dDz18NeAEeufiOvRR5sVhg" type="4001" element="_dDd3wteAEeufiOvRR5sVhg" source="_OWhiINeAEeufiOvRR5sVhg" target="_VikSENeAEeufiOvRR5sVhg">
@@ -1374,6 +1400,54 @@
1374 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_WiUCateBEeufiOvRR5sVhg" id="(0.5070422535211268,1.0)"/> 1400 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_WiUCateBEeufiOvRR5sVhg" id="(0.5070422535211268,1.0)"/>
1375 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_WiUCa9eBEeufiOvRR5sVhg" id="(0.8135593220338984,0.0)"/> 1401 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_WiUCa9eBEeufiOvRR5sVhg" id="(0.8135593220338984,0.0)"/>
1376 </edges> 1402 </edges>
1403 <edges xmi:type="notation:Edge" xmi:id="_s7wgoAGyEey7cfH5K6RyCw" type="4001" element="_s68oXAGyEey7cfH5K6RyCw" source="_pdJrwAGyEey7cfH5K6RyCw" target="_e73WIKA9EeuqkpDnuik1sg">
1404 <children xmi:type="notation:Node" xmi:id="_s7xuwAGyEey7cfH5K6RyCw" type="6001">
1405 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_s7xuwQGyEey7cfH5K6RyCw" y="-10"/>
1406 </children>
1407 <children xmi:type="notation:Node" xmi:id="_s7yV0AGyEey7cfH5K6RyCw" type="6002">
1408 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_s7yV0QGyEey7cfH5K6RyCw" y="10"/>
1409 </children>
1410 <children xmi:type="notation:Node" xmi:id="_s7yV0gGyEey7cfH5K6RyCw" type="6003">
1411 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_s7yV0wGyEey7cfH5K6RyCw" y="10"/>
1412 </children>
1413 <styles xmi:type="notation:ConnectorStyle" xmi:id="_s7wgoQGyEey7cfH5K6RyCw" routing="Tree"/>
1414 <styles xmi:type="notation:FontStyle" xmi:id="_s7wgogGyEey7cfH5K6RyCw" fontName="Noto Sans" fontHeight="8"/>
1415 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_s7wgowGyEey7cfH5K6RyCw" points="[0, -9, -684, 192]$[0, -45, -684, 156]$[685, -45, 1, 156]$[685, -103, 1, 98]"/>
1416 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_s71ZIAGyEey7cfH5K6RyCw" id="(0.652542372881356,0.061224489795918366)"/>
1417 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_s71ZIQGyEey7cfH5K6RyCw" id="(0.5,0.0)"/>
1418 </edges>
1419 <edges xmi:type="notation:Edge" xmi:id="_zKMY0AGyEey7cfH5K6RyCw" type="4001" element="_zJpmRgGyEey7cfH5K6RyCw" source="_pdJrwAGyEey7cfH5K6RyCw" target="_xsq_MKA8EeuqkpDnuik1sg">
1420 <children xmi:type="notation:Node" xmi:id="_zKM_4AGyEey7cfH5K6RyCw" type="6001">
1421 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_zKM_4QGyEey7cfH5K6RyCw" x="-463" y="19"/>
1422 </children>
1423 <children xmi:type="notation:Node" xmi:id="_zKM_4gGyEey7cfH5K6RyCw" type="6002">
1424 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_zKM_4wGyEey7cfH5K6RyCw" x="-91" y="10"/>
1425 </children>
1426 <children xmi:type="notation:Node" xmi:id="_zKM_5AGyEey7cfH5K6RyCw" type="6003">
1427 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_zKM_5QGyEey7cfH5K6RyCw" x="-88" y="10"/>
1428 </children>
1429 <styles xmi:type="notation:ConnectorStyle" xmi:id="_zKMY0QGyEey7cfH5K6RyCw" routing="Rectilinear"/>
1430 <styles xmi:type="notation:FontStyle" xmi:id="_zKMY0gGyEey7cfH5K6RyCw" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/>
1431 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_zKMY0wGyEey7cfH5K6RyCw" points="[-7, -15, -830, 120]$[-7, -63, -830, 72]$[859, -63, 36, 72]$[859, -109, 36, 26]"/>
1432 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_zKNm8AGyEey7cfH5K6RyCw" id="(0.5508474576271186,0.15306122448979592)"/>
1433 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_zKNm8QGyEey7cfH5K6RyCw" id="(0.0,0.7346938775510204)"/>
1434 </edges>
1435 <edges xmi:type="notation:Edge" xmi:id="_WAr2kAGzEey7cfH5K6RyCw" type="4001" element="_WAUqNgGzEey7cfH5K6RyCw" source="_SNlYYAGzEey7cfH5K6RyCw" target="_VikSENeAEeufiOvRR5sVhg">
1436 <children xmi:type="notation:Node" xmi:id="_WAsdoAGzEey7cfH5K6RyCw" type="6001">
1437 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_WAsdoQGzEey7cfH5K6RyCw" y="-10"/>
1438 </children>
1439 <children xmi:type="notation:Node" xmi:id="_WAsdogGzEey7cfH5K6RyCw" type="6002">
1440 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_WAsdowGzEey7cfH5K6RyCw" y="10"/>
1441 </children>
1442 <children xmi:type="notation:Node" xmi:id="_WAsdpAGzEey7cfH5K6RyCw" type="6003">
1443 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_WAsdpQGzEey7cfH5K6RyCw" y="10"/>
1444 </children>
1445 <styles xmi:type="notation:ConnectorStyle" xmi:id="_WAr2kQGzEey7cfH5K6RyCw" routing="Tree"/>
1446 <styles xmi:type="notation:FontStyle" xmi:id="_WAr2kgGzEey7cfH5K6RyCw" fontName="Noto Sans" fontHeight="8"/>
1447 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_WAr2kwGzEey7cfH5K6RyCw" points="[0, 0, -60, 132]$[0, -16, -60, 116]$[67, -16, 7, 116]$[67, -34, 7, 98]"/>
1448 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_WAsdpgGzEey7cfH5K6RyCw" id="(0.25842696629213485,0.07142857142857142)"/>
1449 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_WAsdpwGzEey7cfH5K6RyCw" id="(0.45112781954887216,0.0)"/>
1450 </edges>
1377 </data> 1451 </data>
1378 </ownedAnnotationEntries> 1452 </ownedAnnotationEntries>
1379 <ownedAnnotationEntries xmi:type="description:AnnotationEntry" uid="_Csiy8KA4EeuqkpDnuik1sg" source="DANNOTATION_CUSTOMIZATION_KEY"> 1453 <ownedAnnotationEntries xmi:type="description:AnnotationEntry" uid="_Csiy8KA4EeuqkpDnuik1sg" source="DANNOTATION_CUSTOMIZATION_KEY">
@@ -1849,7 +1923,7 @@
1849 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> 1923 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
1850 <arrangeConstraints>KEEP_SIZE</arrangeConstraints> 1924 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
1851 <arrangeConstraints>KEEP_RATIO</arrangeConstraints> 1925 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
1852 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_ZT0WKteAEeufiOvRR5sVhg" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216"> 1926 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_Zdc4dwGzEey7cfH5K6RyCw" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
1853 <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"/> 1927 <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"/>
1854 </ownedStyle> 1928 </ownedStyle>
1855 <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']"/> 1929 <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']"/>
@@ -1861,6 +1935,14 @@
1861 </ownedStyle> 1935 </ownedStyle>
1862 <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']"/> 1936 <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']"/>
1863 </ownedElements> 1937 </ownedElements>
1938 <ownedElements xmi:type="diagram:DNodeListElement" uid="_Y2m60AGzEey7cfH5K6RyCw" name="default : EBoolean = false" tooltipText="">
1939 <target xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//Assertion/default"/>
1940 <semanticElements xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//Assertion/default"/>
1941 <ownedStyle xmi:type="diagram:BundledImage" uid="_ZdetkwGzEey7cfH5K6RyCw" labelAlignment="LEFT">
1942 <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"/>
1943 </ownedStyle>
1944 <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']"/>
1945 </ownedElements>
1864 </ownedDiagramElements> 1946 </ownedDiagramElements>
1865 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_w-iG36A8EeuqkpDnuik1sg" name="[0..1] relation" sourceNode="_p9d30KA8EeuqkpDnuik1sg" targetNode="_EfNqcKA4EeuqkpDnuik1sg"> 1947 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_w-iG36A8EeuqkpDnuik1sg" name="[0..1] relation" sourceNode="_p9d30KA8EeuqkpDnuik1sg" targetNode="_EfNqcKA4EeuqkpDnuik1sg">
1866 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//Assertion/relation"/> 1948 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//Assertion/relation"/>
@@ -1876,7 +1958,7 @@
1876 </ownedStyle> 1958 </ownedStyle>
1877 <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']"/> 1959 <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']"/>
1878 </ownedDiagramElements> 1960 </ownedDiagramElements>
1879 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_xsYrUKA8EeuqkpDnuik1sg" name="Node" tooltipText="" outgoingEdges="_QlymotbNEeuymriYTNxK2g" incomingEdges="_4eU5TqA8EeuqkpDnuik1sg _-XLKltawEeuymriYTNxK2g _gRDCgNbGEeuymriYTNxK2g _vRo4VteAEeufiOvRR5sVhg _AmBxQNeBEeufiOvRR5sVhg" width="12" height="10"> 1961 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_xsYrUKA8EeuqkpDnuik1sg" name="Node" tooltipText="" outgoingEdges="_QlymotbNEeuymriYTNxK2g" incomingEdges="_4eU5TqA8EeuqkpDnuik1sg _-XLKltawEeuymriYTNxK2g _gRDCgNbGEeuymriYTNxK2g _vRo4VteAEeufiOvRR5sVhg _AmBxQNeBEeufiOvRR5sVhg _zJpmRgGyEey7cfH5K6RyCw" width="12" height="10">
1880 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Node"/> 1962 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Node"/>
1881 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Node"/> 1963 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Node"/>
1882 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> 1964 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
@@ -1934,6 +2016,14 @@
1934 </ownedStyle> 2016 </ownedStyle>
1935 <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']"/> 2017 <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']"/>
1936 </ownedElements> 2018 </ownedElements>
2019 <ownedElements xmi:type="diagram:DNodeListElement" uid="_9K7BcAGzEey7cfH5K6RyCw" name="ERROR" tooltipText="">
2020 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//LogicValue/ERROR"/>
2021 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//LogicValue/ERROR"/>
2022 <ownedStyle xmi:type="diagram:BundledImage" uid="_9K8PkAGzEey7cfH5K6RyCw" labelAlignment="LEFT">
2023 <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"/>
2024 </ownedStyle>
2025 <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']"/>
2026 </ownedElements>
1937 </ownedDiagramElements> 2027 </ownedDiagramElements>
1938 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_QTzgkKA9EeuqkpDnuik1sg" name="ScopeDeclaration" tooltipText="" outgoingEdges="_vdptgqA9EeuqkpDnuik1sg _F2vPU6A-EeuqkpDnuik1sg" width="12" height="10"> 2028 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_QTzgkKA9EeuqkpDnuik1sg" name="ScopeDeclaration" tooltipText="" outgoingEdges="_vdptgqA9EeuqkpDnuik1sg _F2vPU6A-EeuqkpDnuik1sg" width="12" height="10">
1939 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//ScopeDeclaration"/> 2029 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//ScopeDeclaration"/>
@@ -1946,7 +2036,7 @@
1946 </ownedStyle> 2036 </ownedStyle>
1947 <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']"/> 2037 <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']"/>
1948 </ownedDiagramElements> 2038 </ownedDiagramElements>
1949 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_e7ydoKA9EeuqkpDnuik1sg" name="Statement" tooltipText="" incomingEdges="_hU64ZqA9EeuqkpDnuik1sg _mQFKsqA9EeuqkpDnuik1sg _mzziwKA9EeuqkpDnuik1sg _plK3JqA9EeuqkpDnuik1sg _vdptgqA9EeuqkpDnuik1sg _WX_5w9bGEeuymriYTNxK2g _DkzPhteBEeufiOvRR5sVhg" width="12" height="10"> 2039 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_e7ydoKA9EeuqkpDnuik1sg" name="Statement" tooltipText="" incomingEdges="_hU64ZqA9EeuqkpDnuik1sg _mQFKsqA9EeuqkpDnuik1sg _mzziwKA9EeuqkpDnuik1sg _plK3JqA9EeuqkpDnuik1sg _vdptgqA9EeuqkpDnuik1sg _WX_5w9bGEeuymriYTNxK2g _DkzPhteBEeufiOvRR5sVhg _s68oXAGyEey7cfH5K6RyCw" width="12" height="10">
1950 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Statement"/> 2040 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Statement"/>
1951 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Statement"/> 2041 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Statement"/>
1952 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> 2042 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
@@ -1974,12 +2064,12 @@
1974 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_mQFKsqA9EeuqkpDnuik1sg" sourceNode="_p9d30KA8EeuqkpDnuik1sg" targetNode="_e7ydoKA9EeuqkpDnuik1sg"> 2064 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_mQFKsqA9EeuqkpDnuik1sg" sourceNode="_p9d30KA8EeuqkpDnuik1sg" targetNode="_e7ydoKA9EeuqkpDnuik1sg">
1975 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Assertion"/> 2065 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Assertion"/>
1976 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Assertion"/> 2066 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Assertion"/>
1977 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_ZT8SGteAEeufiOvRR5sVhg" lineStyle="dash" targetArrow="InputClosedArrow" routingStyle="tree"> 2067 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_Zdk0XQGzEey7cfH5K6RyCw" lineStyle="dash" targetArrow="InputClosedArrow" routingStyle="tree">
1978 <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"/> 2068 <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"/>
1979 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_ZT8SG9eAEeufiOvRR5sVhg" showIcon="false"> 2069 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_Zdk0XgGzEey7cfH5K6RyCw" showIcon="false">
1980 <labelFormat>italic</labelFormat> 2070 <labelFormat>italic</labelFormat>
1981 </beginLabelStyle> 2071 </beginLabelStyle>
1982 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_ZT8SHNeAEeufiOvRR5sVhg" showIcon="false"/> 2072 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_Zdk0XwGzEey7cfH5K6RyCw" showIcon="false"/>
1983 </ownedStyle> 2073 </ownedStyle>
1984 <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']"/> 2074 <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']"/>
1985 </ownedDiagramElements> 2075 </ownedDiagramElements>
@@ -2540,7 +2630,7 @@
2540 </ownedStyle> 2630 </ownedStyle>
2541 <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']"/> 2631 <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']"/>
2542 </ownedDiagramElements> 2632 </ownedDiagramElements>
2543 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_ViJbUNeAEeufiOvRR5sVhg" name="AssertionArgument" tooltipText="" incomingEdges="_YAoQHdeAEeufiOvRR5sVhg _dDd3wteAEeufiOvRR5sVhg _g_aI1teAEeufiOvRR5sVhg" width="12" height="10"> 2633 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_ViJbUNeAEeufiOvRR5sVhg" name="AssertionArgument" tooltipText="" incomingEdges="_YAoQHdeAEeufiOvRR5sVhg _dDd3wteAEeufiOvRR5sVhg _g_aI1teAEeufiOvRR5sVhg _WAUqNgGzEey7cfH5K6RyCw" width="12" height="10">
2544 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AssertionArgument"/> 2634 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AssertionArgument"/>
2545 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AssertionArgument"/> 2635 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//AssertionArgument"/>
2546 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> 2636 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
@@ -2690,6 +2780,65 @@
2690 </ownedStyle> 2780 </ownedStyle>
2691 <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']"/> 2781 <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']"/>
2692 </ownedDiagramElements> 2782 </ownedDiagramElements>
2783 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_pcXBkAGyEey7cfH5K6RyCw" name="UniqueDeclaration" tooltipText="" outgoingEdges="_s68oXAGyEey7cfH5K6RyCw _zJpmRgGyEey7cfH5K6RyCw" width="12" height="10">
2784 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//UniqueDeclaration"/>
2785 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//UniqueDeclaration"/>
2786 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
2787 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
2788 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
2789 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_pcYPsAGyEey7cfH5K6RyCw" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
2790 <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"/>
2791 </ownedStyle>
2792 <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']"/>
2793 </ownedDiagramElements>
2794 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_s68oXAGyEey7cfH5K6RyCw" sourceNode="_pcXBkAGyEey7cfH5K6RyCw" targetNode="_e7ydoKA9EeuqkpDnuik1sg">
2795 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//UniqueDeclaration"/>
2796 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//UniqueDeclaration"/>
2797 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_s69PYAGyEey7cfH5K6RyCw" lineStyle="dash" targetArrow="InputClosedArrow" routingStyle="tree">
2798 <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"/>
2799 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_s69PYQGyEey7cfH5K6RyCw" showIcon="false">
2800 <labelFormat>italic</labelFormat>
2801 </beginLabelStyle>
2802 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_s69PYgGyEey7cfH5K6RyCw" showIcon="false"/>
2803 </ownedStyle>
2804 <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']"/>
2805 </ownedDiagramElements>
2806 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_zJpmRgGyEey7cfH5K6RyCw" name="[0..*] nodes" sourceNode="_pcXBkAGyEey7cfH5K6RyCw" targetNode="_xsYrUKA8EeuqkpDnuik1sg">
2807 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//UniqueDeclaration/nodes"/>
2808 <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//UniqueDeclaration/nodes"/>
2809 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_zJqNUAGyEey7cfH5K6RyCw" description="_L-JhMKA4EeuqkpDnuik1sg" sourceArrow="FillDiamond" routingStyle="manhattan" strokeColor="0,0,0">
2810 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_zJqNUgGyEey7cfH5K6RyCw" showIcon="false">
2811 <customFeatures>labelSize</customFeatures>
2812 </centerLabelStyle>
2813 <endLabelStyle xmi:type="diagram:EndLabelStyle" uid="_zJqNUQGyEey7cfH5K6RyCw" showIcon="false" labelColor="39,76,114">
2814 <customFeatures>labelSize</customFeatures>
2815 </endLabelStyle>
2816 </ownedStyle>
2817 <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']"/>
2818 </ownedDiagramElements>
2819 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_SNSdcAGzEey7cfH5K6RyCw" name="WildcardAssertionArgument" tooltipText="" outgoingEdges="_WAUqNgGzEey7cfH5K6RyCw" width="12" height="10">
2820 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//WildcardAssertionArgument"/>
2821 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//WildcardAssertionArgument"/>
2822 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
2823 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
2824 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
2825 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_SNSdcQGzEey7cfH5K6RyCw" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
2826 <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"/>
2827 </ownedStyle>
2828 <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']"/>
2829 </ownedDiagramElements>
2830 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_WAUqNgGzEey7cfH5K6RyCw" sourceNode="_SNSdcAGzEey7cfH5K6RyCw" targetNode="_ViJbUNeAEeufiOvRR5sVhg">
2831 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//WildcardAssertionArgument"/>
2832 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//WildcardAssertionArgument"/>
2833 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_WAUqNwGzEey7cfH5K6RyCw" targetArrow="InputClosedArrow" routingStyle="tree">
2834 <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"/>
2835 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_WAUqOAGzEey7cfH5K6RyCw" showIcon="false">
2836 <labelFormat>italic</labelFormat>
2837 </beginLabelStyle>
2838 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_WAUqOQGzEey7cfH5K6RyCw" showIcon="false"/>
2839 </ownedStyle>
2840 <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']"/>
2841 </ownedDiagramElements>
2693 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/> 2842 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/>
2694 <filterVariableHistory xmi:type="diagram:FilterVariableHistory" uid="_CsWlsKA4EeuqkpDnuik1sg"/> 2843 <filterVariableHistory xmi:type="diagram:FilterVariableHistory" uid="_CsWlsKA4EeuqkpDnuik1sg"/>
2695 <activatedLayers xmi:type="description_1:Layer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer"/> 2844 <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/language-model/src/main/resources/model/problem.ecore b/language-model/src/main/resources/model/problem.ecore
index 43d69a86..95653ca4 100644
--- a/language-model/src/main/resources/model/problem.ecore
+++ b/language-model/src/main/resources/model/problem.ecore
@@ -64,12 +64,15 @@
64 <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="#//LogicValue"/> 64 <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="#//LogicValue"/>
65 <eStructuralFeatures xsi:type="ecore:EReference" name="arguments" upperBound="-1" 65 <eStructuralFeatures xsi:type="ecore:EReference" name="arguments" upperBound="-1"
66 eType="#//AssertionArgument" containment="true"/> 66 eType="#//AssertionArgument" containment="true"/>
67 <eStructuralFeatures xsi:type="ecore:EAttribute" name="default" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
68 defaultValueLiteral="false"/>
67 </eClassifiers> 69 </eClassifiers>
68 <eClassifiers xsi:type="ecore:EClass" name="Node" eSuperTypes="#//VariableOrNode"/> 70 <eClassifiers xsi:type="ecore:EClass" name="Node" eSuperTypes="#//VariableOrNode"/>
69 <eClassifiers xsi:type="ecore:EEnum" name="LogicValue"> 71 <eClassifiers xsi:type="ecore:EEnum" name="LogicValue">
70 <eLiterals name="TRUE" literal="TRUE"/> 72 <eLiterals name="TRUE" literal="TRUE"/>
71 <eLiterals name="FALSE" value="1"/> 73 <eLiterals name="FALSE" value="1"/>
72 <eLiterals name="UNKNOWN" value="2"/> 74 <eLiterals name="UNKNOWN" value="2"/>
75 <eLiterals name="ERROR" value="3"/>
73 </eClassifiers> 76 </eClassifiers>
74 <eClassifiers xsi:type="ecore:EClass" name="ScopeDeclaration" eSuperTypes="#//Statement"> 77 <eClassifiers xsi:type="ecore:EClass" name="ScopeDeclaration" eSuperTypes="#//Statement">
75 <eStructuralFeatures xsi:type="ecore:EReference" name="typeScopes" upperBound="-1" 78 <eStructuralFeatures xsi:type="ecore:EReference" name="typeScopes" upperBound="-1"
@@ -134,4 +137,9 @@
134 <eStructuralFeatures xsi:type="ecore:EReference" name="value" eType="#//Constant" 137 <eStructuralFeatures xsi:type="ecore:EReference" name="value" eType="#//Constant"
135 containment="true"/> 138 containment="true"/>
136 </eClassifiers> 139 </eClassifiers>
140 <eClassifiers xsi:type="ecore:EClass" name="UniqueDeclaration" eSuperTypes="#//Statement">
141 <eStructuralFeatures xsi:type="ecore:EReference" name="nodes" upperBound="-1"
142 eType="#//Node" containment="true"/>
143 </eClassifiers>
144 <eClassifiers xsi:type="ecore:EClass" name="WildcardAssertionArgument" eSuperTypes="#//AssertionArgument"/>
137</ecore:EPackage> 145</ecore:EPackage>
diff --git a/language-model/src/main/resources/model/problem.genmodel b/language-model/src/main/resources/model/problem.genmodel
index fb93d60e..baadd435 100644
--- a/language-model/src/main/resources/model/problem.genmodel
+++ b/language-model/src/main/resources/model/problem.genmodel
@@ -14,6 +14,7 @@
14 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//LogicValue/TRUE"/> 14 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//LogicValue/TRUE"/>
15 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//LogicValue/FALSE"/> 15 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//LogicValue/FALSE"/>
16 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//LogicValue/UNKNOWN"/> 16 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//LogicValue/UNKNOWN"/>
17 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//LogicValue/ERROR"/>
17 </genEnums> 18 </genEnums>
18 <genClasses ecoreClass="problem.ecore#//Problem"> 19 <genClasses ecoreClass="problem.ecore#//Problem">
19 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//Problem/nodes"/> 20 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//Problem/nodes"/>
@@ -64,6 +65,7 @@
64 <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference problem.ecore#//Assertion/relation"/> 65 <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference problem.ecore#//Assertion/relation"/>
65 <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//Assertion/value"/> 66 <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//Assertion/value"/>
66 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//Assertion/arguments"/> 67 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//Assertion/arguments"/>
68 <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//Assertion/default"/>
67 </genClasses> 69 </genClasses>
68 <genClasses ecoreClass="problem.ecore#//Node"/> 70 <genClasses ecoreClass="problem.ecore#//Node"/>
69 <genClasses ecoreClass="problem.ecore#//ScopeDeclaration"> 71 <genClasses ecoreClass="problem.ecore#//ScopeDeclaration">
@@ -117,5 +119,9 @@
117 <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference problem.ecore#//NodeValueAssertion/node"/> 119 <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference problem.ecore#//NodeValueAssertion/node"/>
118 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//NodeValueAssertion/value"/> 120 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//NodeValueAssertion/value"/>
119 </genClasses> 121 </genClasses>
122 <genClasses ecoreClass="problem.ecore#//UniqueDeclaration">
123 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//UniqueDeclaration/nodes"/>
124 </genClasses>
125 <genClasses ecoreClass="problem.ecore#//WildcardAssertionArgument"/>
120 </genPackages> 126 </genPackages>
121</genmodel:GenModel> 127</genmodel:GenModel>
diff --git a/language-mwe2/src/main/java/org/eclipse/viatra/solver/language/mwe2/ProblemWebIntegrationFragment.java b/language-mwe2/src/main/java/org/eclipse/viatra/solver/language/mwe2/ProblemWebIntegrationFragment.java
index 78311e0d..8a2c6538 100644
--- a/language-mwe2/src/main/java/org/eclipse/viatra/solver/language/mwe2/ProblemWebIntegrationFragment.java
+++ b/language-mwe2/src/main/java/org/eclipse/viatra/solver/language/mwe2/ProblemWebIntegrationFragment.java
@@ -13,8 +13,6 @@ public class ProblemWebIntegrationFragment extends WebIntegrationFragment {
13 13
14 public ProblemWebIntegrationFragment() { 14 public ProblemWebIntegrationFragment() {
15 setFramework(Framework.CODEMIRROR.name()); 15 setFramework(Framework.CODEMIRROR.name());
16 // We use our custom token style for single-quoted names
17 addSuppressPattern("string_singleQuote");
18 // Use the CodeMirror default .cm-number instead of .cm-constant.cm-numeric 16 // Use the CodeMirror default .cm-number instead of .cm-constant.cm-numeric
19 addSuppressPattern("number_decimal"); 17 addSuppressPattern("number_decimal");
20 // We use our own custom single-line comments 18 // We use our own custom single-line comments
@@ -39,12 +37,9 @@ public class ProblemWebIntegrationFragment extends WebIntegrationFragment {
39 @Override 37 @Override
40 protected Multimap<String, String> createCodeMirrorPatterns(String langId, Set<String> keywords) { 38 protected Multimap<String, String> createCodeMirrorPatterns(String langId, Set<String> keywords) {
41 Multimap<String, String> patterns = super.createCodeMirrorPatterns(langId, keywords); 39 Multimap<String, String> patterns = super.createCodeMirrorPatterns(langId, keywords);
42 // We use our custom token style for single-quoted names
43 patterns.put(START_STATE, "{token: \"quoted-name\", regex: \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"}");
44 // Use the CodeMirror default .cm-number instead of .cm-constant.cm-numeric 40 // Use the CodeMirror default .cm-number instead of .cm-constant.cm-numeric
45 patterns.put(START_STATE, 41 patterns.put(START_STATE,
46 "{token: \"number\", regex: \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"}"); 42 "{token: \"number\", regex: \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"}");
47 patterns.put(START_STATE, "{token: \"number\", regex: \"[*]\"}");
48 // We use our own custom single-line comments 43 // We use our own custom single-line comments
49 patterns.put(START_STATE, "{token: \"comment\", regex: \"%.*$\"}"); 44 patterns.put(START_STATE, "{token: \"comment\", regex: \"%.*$\"}");
50 patterns.put(START_STATE, "{token: \"comment\", regex: \"\\\\/\\\\/.*$\"}"); 45 patterns.put(START_STATE, "{token: \"comment\", regex: \"\\\\/\\\\/.*$\"}");
@@ -53,7 +48,7 @@ public class ProblemWebIntegrationFragment extends WebIntegrationFragment {
53 patterns.put(START_STATE, "{token: \"lparen\", indent: true, regex: \"[[({]\"}"); 48 patterns.put(START_STATE, "{token: \"lparen\", indent: true, regex: \"[[({]\"}");
54 patterns.put(START_STATE, "{token: \"rparen\", dedent: true, regex: \"[\\\\])}]\"}"); 49 patterns.put(START_STATE, "{token: \"rparen\", dedent: true, regex: \"[\\\\])}]\"}");
55 patterns.putAll(PREDICATE_BODY_STATE, patterns.get(START_STATE)); 50 patterns.putAll(PREDICATE_BODY_STATE, patterns.get(START_STATE));
56 patterns.put(START_STATE, "{indent: true, push: \"" + PREDICATE_BODY_STATE + "\", regex: \"<=>\"}"); 51 patterns.put(START_STATE, "{indent: true, push: \"" + PREDICATE_BODY_STATE + "\", regex: \"<->\"}");
57 patterns.put(PREDICATE_BODY_STATE, 52 patterns.put(PREDICATE_BODY_STATE,
58 "{dedent: true, dedentIfLineStart: false, pop: true, regex: \"\\\\.\\\\s*$\"}"); 53 "{dedent: true, dedentIfLineStart: false, pop: true, regex: \"\\\\.\\\\s*$\"}");
59 patterns.put(PREDICATE_BODY_STATE, "{indent: true, dedent: true, regex: \"[;]\"}"); 54 patterns.put(PREDICATE_BODY_STATE, "{indent: true, dedent: true, regex: \"[;]\"}");
diff --git a/language-web/src/main/css/index.scss b/language-web/src/main/css/index.scss
index 3ed91824..c92588b8 100644
--- a/language-web/src/main/css/index.scss
+++ b/language-web/src/main/css/index.scss
@@ -127,7 +127,7 @@ li.CodeMirror-hint-active {
127 font-weight: 700; 127 font-weight: 700;
128} 128}
129 129
130.cm-quoted-name, .problem-enum-node { 130.problem-unique-node {
131 @extend .cm-atom; 131 @extend .cm-atom;
132} 132}
133 133
diff --git a/language-web/src/main/js/index.jsx b/language-web/src/main/js/index.jsx
index b3277a30..40b02b14 100644
--- a/language-web/src/main/js/index.jsx
+++ b/language-web/src/main/js/index.jsx
@@ -25,15 +25,17 @@ enum TaxStatus {
25} 25}
26 26
27% A child cannot have any dependents. 27% A child cannot have any dependents.
28error invalidTaxStatus(Person p) <=> 28error invalidTaxStatus(Person p) <->
29 taxStatus(p, child), children(p, _q). 29 taxStatus(p, child), children(p, _q).
30 30
31Family('family'). 31unique family.
32members('family', anne). 32Family(family).
33members('family', bob). 33members(family, anne).
34members('family', ciri). 34members(family, bob).
35members(family, ciri).
35children(anne, ciri). 36children(anne, ciri).
36?children(bob, ciri). 37?children(bob, ciri).
38default children(ciri, *): false.
37taxStatus(anne, adult). 39taxStatus(anne, adult).
38age(anne, 35). 40age(anne, 35).
39bobAge: 27. 41bobAge: 27.
diff --git a/language/src/main/java/org/eclipse/viatra/solver/language/Problem.xtext b/language/src/main/java/org/eclipse/viatra/solver/language/Problem.xtext
index 9e032a13..d4fa6f35 100644
--- a/language/src/main/java/org/eclipse/viatra/solver/language/Problem.xtext
+++ b/language/src/main/java/org/eclipse/viatra/solver/language/Problem.xtext
@@ -8,7 +8,8 @@ Problem:
8 statements+=Statement*; 8 statements+=Statement*;
9 9
10Statement: 10Statement:
11 ClassDeclaration | EnumDeclaration | PredicateDefinition | Assertion | NodeValueAssertion | ScopeDeclaration; 11 ClassDeclaration | EnumDeclaration | PredicateDefinition | Assertion | NodeValueAssertion | ScopeDeclaration |
12 UniqueDeclaration;
12 13
13ClassDeclaration: 14ClassDeclaration:
14 abstract?="abstract"? "class" 15 abstract?="abstract"? "class"
@@ -25,7 +26,7 @@ EnumLiteral returns Node:
25 name=Identifier; 26 name=Identifier;
26 27
27ReferenceDeclaration: 28ReferenceDeclaration:
28 (containment?="contains" | "refers")? 29 (-> (containment?="contains" | "refers"))?
29 referenceType=[Relation|QualifiedName] 30 referenceType=[Relation|QualifiedName]
30 ("[" multiplicity=Multiplicity "]")? 31 ("[" multiplicity=Multiplicity "]")?
31 name=Identifier 32 name=Identifier
@@ -35,7 +36,7 @@ PredicateDefinition:
35 (error?="error" "pred"? | "pred") 36 (error?="error" "pred"? | "pred")
36 name=Identifier 37 name=Identifier
37 "(" (parameters+=Parameter ("," parameters+=Parameter)*)? ")" 38 "(" (parameters+=Parameter ("," parameters+=Parameter)*)? ")"
38 ("<=>" bodies+=Conjunction (";" bodies+=Conjunction)*)? 39 ("<->" bodies+=Conjunction (";" bodies+=Conjunction)*)?
39 "."; 40 ".";
40 41
41Parameter: 42Parameter:
@@ -65,6 +66,7 @@ ConstantArgument:
65 constant=Constant; 66 constant=Constant;
66 67
67Assertion: 68Assertion:
69 default?="default"?
68 (relation=[Relation|QualifiedName] 70 (relation=[Relation|QualifiedName]
69 "(" (arguments+=AssertionArgument ("," arguments+=AssertionArgument)*)? ")" 71 "(" (arguments+=AssertionArgument ("," arguments+=AssertionArgument)*)? ")"
70 ":" value=LogicValue | 72 ":" value=LogicValue |
@@ -74,16 +76,19 @@ Assertion:
74 "."; 76 ".";
75 77
76AssertionArgument: 78AssertionArgument:
77 NodeAssertionArgument | ConstantAssertionArgument; 79 NodeAssertionArgument | WildcardAssertionArgument | ConstantAssertionArgument;
78 80
79NodeAssertionArgument: 81NodeAssertionArgument:
80 node=[Node|QualifiedName]; 82 node=[Node|QualifiedName];
81 83
84WildcardAssertionArgument:
85 {WildcardAssertionArgument} "*";
86
82ConstantAssertionArgument: 87ConstantAssertionArgument:
83 constant=Constant; 88 constant=Constant;
84 89
85enum LogicValue: 90enum LogicValue:
86 TRUE="true" | FALSE="false" | UNKNOWN="unknown"; 91 TRUE="true" | FALSE="false" | UNKNOWN="unknown" | ERROR="error";
87 92
88enum ShortLogicValue returns LogicValue: 93enum ShortLogicValue returns LogicValue:
89 FALSE="!" | UNKNOWN="?"; 94 FALSE="!" | UNKNOWN="?";
@@ -126,14 +131,18 @@ RangeMultiplicity:
126ExactMultiplicity: 131ExactMultiplicity:
127 exactValue=INT; 132 exactValue=INT;
128 133
134UniqueDeclaration:
135 "unique" nodes+=EnumLiteral ("," nodes+=EnumLiteral)* ".";
136
129UpperBound returns ecore::EInt: 137UpperBound returns ecore::EInt:
130 INT | "*"; 138 INT | "*";
131 139
132QualifiedName hidden(): 140QualifiedName hidden():
133 QUOTED_ID | Identifier ("::" Identifier)*; 141 Identifier ("::" Identifier)*;
134 142
135Identifier: 143Identifier:
136 ID | "true" | "false"; 144 ID | "true" | "false" | "unknown" | "error" | "class" | "abstract" | "extends" | "enum" | "pred" | "scope" |
145 "unique" | "default" | "problem" | "contains" | "refers";
137 146
138Integer returns ecore::EInt hidden(): 147Integer returns ecore::EInt hidden():
139 "-"? INT; 148 "-"? INT;
@@ -143,18 +152,11 @@ Real returns ecore::EDouble:
143 152
144@Override 153@Override
145terminal ID: 154terminal ID:
146 ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*; 155 ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*;
147 156
148terminal EXPONENTIAL: 157terminal EXPONENTIAL:
149 INT ("e" | "E") ("+" | "-")? INT; 158 INT ("e" | "E") ("+" | "-")? INT;
150 159
151@Override 160@Override
152terminal STRING:
153 '"' ('\\' . /* 'b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\' */ | !('\\' | '"'))* '"';
154
155terminal QUOTED_ID:
156 "'" ('\\' . /* 'b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\' */ | !('\\' | "'"))* "'";
157
158@Override
159terminal SL_COMMENT: 161terminal SL_COMMENT:
160 ('%' | '//') !('\n' | '\r')* ('\r'? '\n')?; 162 ('%' | '//') !('\n' | '\r')* ('\r'? '\n')?;
diff --git a/language/src/main/java/org/eclipse/viatra/solver/language/ProblemUtil.java b/language/src/main/java/org/eclipse/viatra/solver/language/ProblemUtil.java
index 2d7fede6..1581186c 100644
--- a/language/src/main/java/org/eclipse/viatra/solver/language/ProblemUtil.java
+++ b/language/src/main/java/org/eclipse/viatra/solver/language/ProblemUtil.java
@@ -16,7 +16,6 @@ import org.eclipse.viatra.solver.language.model.problem.ProblemPackage;
16import org.eclipse.viatra.solver.language.model.problem.ReferenceDeclaration; 16import org.eclipse.viatra.solver.language.model.problem.ReferenceDeclaration;
17import org.eclipse.viatra.solver.language.model.problem.Relation; 17import org.eclipse.viatra.solver.language.model.problem.Relation;
18import org.eclipse.viatra.solver.language.model.problem.Variable; 18import org.eclipse.viatra.solver.language.model.problem.Variable;
19import org.eclipse.viatra.solver.language.naming.NamingUtil;
20import org.eclipse.viatra.solver.language.scoping.ProblemGlobalScopeProvider; 19import org.eclipse.viatra.solver.language.scoping.ProblemGlobalScopeProvider;
21 20
22import com.google.common.collect.ImmutableList; 21import com.google.common.collect.ImmutableList;
@@ -32,12 +31,10 @@ public final class ProblemUtil {
32 return variable.eContainingFeature() == ProblemPackage.Literals.VARIABLE_OR_NODE_ARGUMENT__SINGLETON_VARIABLE; 31 return variable.eContainingFeature() == ProblemPackage.Literals.VARIABLE_OR_NODE_ARGUMENT__SINGLETON_VARIABLE;
33 } 32 }
34 33
35 public static boolean isEnumLiteral(Node node) { 34 public static boolean isUniqueNode(Node node) {
36 return node.eContainingFeature() == ProblemPackage.Literals.ENUM_DECLARATION__LITERALS; 35 var containingFeature = node.eContainingFeature();
37 } 36 return containingFeature == ProblemPackage.Literals.UNIQUE_DECLARATION__NODES
38 37 || containingFeature == ProblemPackage.Literals.ENUM_DECLARATION__LITERALS;
39 public static boolean isEnumNode(Node node) {
40 return NamingUtil.isQuotedName(node.getName()) || isEnumLiteral(node);
41 } 38 }
42 39
43 public static boolean isNewNode(Node node) { 40 public static boolean isNewNode(Node node) {
diff --git a/language/src/main/java/org/eclipse/viatra/solver/language/naming/NamingUtil.java b/language/src/main/java/org/eclipse/viatra/solver/language/naming/NamingUtil.java
index decc014a..edd455bb 100644
--- a/language/src/main/java/org/eclipse/viatra/solver/language/naming/NamingUtil.java
+++ b/language/src/main/java/org/eclipse/viatra/solver/language/naming/NamingUtil.java
@@ -4,8 +4,6 @@ import java.util.regex.Pattern;
4 4
5public final class NamingUtil { 5public final class NamingUtil {
6 private static final String SINGLETON_VARIABLE_PREFIX = "_"; 6 private static final String SINGLETON_VARIABLE_PREFIX = "_";
7
8 private static final String ENUM_NODE_NAME_QUOTE = "'";
9 7
10 private static final Pattern ID_REGEX = Pattern.compile("[_a-zA-Z][_0-9a-zA-Z]*"); 8 private static final Pattern ID_REGEX = Pattern.compile("[_a-zA-Z][_0-9a-zA-Z]*");
11 9
@@ -20,16 +18,8 @@ public final class NamingUtil {
20 public static boolean isSingletonVariableName(String name) { 18 public static boolean isSingletonVariableName(String name) {
21 return name != null && name.startsWith(SINGLETON_VARIABLE_PREFIX); 19 return name != null && name.startsWith(SINGLETON_VARIABLE_PREFIX);
22 } 20 }
23
24 public static boolean isQuotedName(String name) {
25 return name != null && name.startsWith(ENUM_NODE_NAME_QUOTE) && name.endsWith(ENUM_NODE_NAME_QUOTE);
26 }
27 21
28 public static boolean isValidId(String name) { 22 public static boolean isValidId(String name) {
29 return name != null && ID_REGEX.matcher(name).matches(); 23 return name != null && ID_REGEX.matcher(name).matches();
30 } 24 }
31
32 public static boolean isValidNodeName(String name) {
33 return isValidId(name) || isQuotedName(name);
34 }
35} 25}
diff --git a/language/src/main/java/org/eclipse/viatra/solver/language/resource/NodeNameCollector.java b/language/src/main/java/org/eclipse/viatra/solver/language/resource/NodeNameCollector.java
index 597dd92d..e9533c25 100644
--- a/language/src/main/java/org/eclipse/viatra/solver/language/resource/NodeNameCollector.java
+++ b/language/src/main/java/org/eclipse/viatra/solver/language/resource/NodeNameCollector.java
@@ -2,24 +2,16 @@ package org.eclipse.viatra.solver.language.resource;
2 2
3import java.util.List; 3import java.util.List;
4import java.util.Set; 4import java.util.Set;
5import java.util.function.Predicate;
6 5
7import org.eclipse.emf.ecore.EObject; 6import org.eclipse.emf.ecore.EObject;
8import org.eclipse.emf.ecore.EStructuralFeature; 7import org.eclipse.emf.ecore.EStructuralFeature;
9import org.eclipse.viatra.solver.language.model.problem.Argument;
10import org.eclipse.viatra.solver.language.model.problem.Assertion; 8import org.eclipse.viatra.solver.language.model.problem.Assertion;
11import org.eclipse.viatra.solver.language.model.problem.AssertionArgument; 9import org.eclipse.viatra.solver.language.model.problem.AssertionArgument;
12import org.eclipse.viatra.solver.language.model.problem.Atom;
13import org.eclipse.viatra.solver.language.model.problem.Conjunction;
14import org.eclipse.viatra.solver.language.model.problem.Literal;
15import org.eclipse.viatra.solver.language.model.problem.NegativeLiteral;
16import org.eclipse.viatra.solver.language.model.problem.NodeAssertionArgument; 10import org.eclipse.viatra.solver.language.model.problem.NodeAssertionArgument;
17import org.eclipse.viatra.solver.language.model.problem.NodeValueAssertion; 11import org.eclipse.viatra.solver.language.model.problem.NodeValueAssertion;
18import org.eclipse.viatra.solver.language.model.problem.PredicateDefinition;
19import org.eclipse.viatra.solver.language.model.problem.Problem; 12import org.eclipse.viatra.solver.language.model.problem.Problem;
20import org.eclipse.viatra.solver.language.model.problem.ProblemPackage; 13import org.eclipse.viatra.solver.language.model.problem.ProblemPackage;
21import org.eclipse.viatra.solver.language.model.problem.Statement; 14import org.eclipse.viatra.solver.language.model.problem.Statement;
22import org.eclipse.viatra.solver.language.model.problem.VariableOrNodeArgument;
23import org.eclipse.viatra.solver.language.naming.NamingUtil; 15import org.eclipse.viatra.solver.language.naming.NamingUtil;
24import org.eclipse.xtext.linking.impl.LinkingHelper; 16import org.eclipse.xtext.linking.impl.LinkingHelper;
25import org.eclipse.xtext.naming.IQualifiedNameConverter; 17import org.eclipse.xtext.naming.IQualifiedNameConverter;
@@ -64,57 +56,26 @@ public class NodeNameCollector {
64 collectAssertionNodeNames((Assertion) statement); 56 collectAssertionNodeNames((Assertion) statement);
65 } else if (statement instanceof NodeValueAssertion) { 57 } else if (statement instanceof NodeValueAssertion) {
66 collectNodeValueAssertionNodeNames((NodeValueAssertion) statement); 58 collectNodeValueAssertionNodeNames((NodeValueAssertion) statement);
67 } else if (statement instanceof PredicateDefinition) {
68 collectPredicateDefinitionNodeNames((PredicateDefinition) statement);
69 } 59 }
70 } 60 }
71 61
72 protected void collectAssertionNodeNames(Assertion assertion) { 62 protected void collectAssertionNodeNames(Assertion assertion) {
73 for (AssertionArgument argument : assertion.getArguments()) { 63 for (AssertionArgument argument : assertion.getArguments()) {
74 if (argument instanceof NodeAssertionArgument) { 64 if (argument instanceof NodeAssertionArgument) {
75 collectNodeNames(argument, ProblemPackage.Literals.NODE_ASSERTION_ARGUMENT__NODE, 65 collectNodeNames(argument, ProblemPackage.Literals.NODE_ASSERTION_ARGUMENT__NODE);
76 NamingUtil::isValidNodeName);
77 } 66 }
78 } 67 }
79 } 68 }
80 69
81 protected void collectNodeValueAssertionNodeNames(NodeValueAssertion nodeValueAssertion) { 70 protected void collectNodeValueAssertionNodeNames(NodeValueAssertion nodeValueAssertion) {
82 collectNodeNames(nodeValueAssertion, ProblemPackage.Literals.NODE_VALUE_ASSERTION__NODE, 71 collectNodeNames(nodeValueAssertion, ProblemPackage.Literals.NODE_VALUE_ASSERTION__NODE);
83 NamingUtil::isValidNodeName);
84 } 72 }
85 73
86 protected void collectPredicateDefinitionNodeNames(PredicateDefinition predicateDefinition) { 74 private void collectNodeNames(EObject eObject, EStructuralFeature feature) {
87 for (Conjunction body : predicateDefinition.getBodies()) {
88 for (Literal literal : body.getLiterals()) {
89 collectLiteralNodeNames(literal);
90 }
91 }
92 }
93
94 protected void collectLiteralNodeNames(Literal literal) {
95 Atom atom = null;
96 if (literal instanceof Atom) {
97 atom = (Atom) literal;
98 } else if (literal instanceof NegativeLiteral) {
99 var negativeLiteral = (NegativeLiteral) literal;
100 atom = negativeLiteral.getAtom();
101 }
102 if (atom == null) {
103 return;
104 }
105 for (Argument argument : atom.getArguments()) {
106 if (argument instanceof VariableOrNodeArgument) {
107 collectNodeNames(argument, ProblemPackage.Literals.VARIABLE_OR_NODE_ARGUMENT__VARIABLE_OR_NODE,
108 NamingUtil::isQuotedName);
109 }
110 }
111 }
112
113 private void collectNodeNames(EObject eObject, EStructuralFeature feature, Predicate<String> condition) {
114 List<INode> nodes = NodeModelUtils.findNodesForFeature(eObject, feature); 75 List<INode> nodes = NodeModelUtils.findNodesForFeature(eObject, feature);
115 for (INode node : nodes) { 76 for (INode node : nodes) {
116 var nodeName = linkingHelper.getCrossRefNodeAsString(node, true); 77 var nodeName = linkingHelper.getCrossRefNodeAsString(node, true);
117 if (!condition.test(nodeName)) { 78 if (!NamingUtil.isValidId(nodeName)) {
118 continue; 79 continue;
119 } 80 }
120 var qualifiedName = qualifiedNameConverter.toQualifiedName(nodeName); 81 var qualifiedName = qualifiedNameConverter.toQualifiedName(nodeName);
diff --git a/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemLocationInFileProvider.java b/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemLocationInFileProvider.java
index 94dbdfee..80bbdb0f 100644
--- a/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemLocationInFileProvider.java
+++ b/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemLocationInFileProvider.java
@@ -20,7 +20,7 @@ public class ProblemLocationInFileProvider extends DefaultLocationInFileProvider
20 } 20 }
21 21
22 protected ITextRegion getNodeTextRegion(Node node, RegionDescription query) { 22 protected ITextRegion getNodeTextRegion(Node node, RegionDescription query) {
23 if (ProblemUtil.isEnumLiteral(node)) { 23 if (ProblemUtil.isUniqueNode(node)) {
24 return super.doGetTextRegion(node, query); 24 return super.doGetTextRegion(node, query);
25 } 25 }
26 if (ProblemUtil.isNewNode(node)) { 26 if (ProblemUtil.isNewNode(node)) {
diff --git a/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemResourceDescriptionStrategy.java b/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemResourceDescriptionStrategy.java
index da737e3d..012606d6 100644
--- a/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemResourceDescriptionStrategy.java
+++ b/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemResourceDescriptionStrategy.java
@@ -45,6 +45,7 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti
45 while (parent != null && parent != problem) { 45 while (parent != null && parent != problem) {
46 var parentQualifiedName = getNameAsQualifiedName(parent); 46 var parentQualifiedName = getNameAsQualifiedName(parent);
47 if (parentQualifiedName == null) { 47 if (parentQualifiedName == null) {
48 parent = parent.eContainer();
48 continue; 49 continue;
49 } 50 }
50 qualifiedName = parentQualifiedName.append(qualifiedName); 51 qualifiedName = parentQualifiedName.append(qualifiedName);
@@ -82,7 +83,7 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti
82 if (eObject instanceof Node) { 83 if (eObject instanceof Node) {
83 var node = (Node) eObject; 84 var node = (Node) eObject;
84 // Only enum literals and new nodes are visible across problem files. 85 // Only enum literals and new nodes are visible across problem files.
85 return ProblemUtil.isEnumLiteral(node) || ProblemUtil.isNewNode(node); 86 return ProblemUtil.isUniqueNode(node) || ProblemUtil.isNewNode(node);
86 } 87 }
87 return true; 88 return true;
88 } 89 }
diff --git a/language/src/test/java/org/eclipse/viatra/solver/language/tests/ProblemTestUtil.xtend b/language/src/test/java/org/eclipse/viatra/solver/language/tests/ProblemTestUtil.xtend
index f2aedfd5..b3175659 100644
--- a/language/src/test/java/org/eclipse/viatra/solver/language/tests/ProblemTestUtil.xtend
+++ b/language/src/test/java/org/eclipse/viatra/solver/language/tests/ProblemTestUtil.xtend
@@ -17,6 +17,7 @@ import org.eclipse.viatra.solver.language.model.problem.PredicateDefinition
17import org.eclipse.viatra.solver.language.model.problem.Problem 17import org.eclipse.viatra.solver.language.model.problem.Problem
18import org.eclipse.viatra.solver.language.model.problem.Variable 18import org.eclipse.viatra.solver.language.model.problem.Variable
19import org.eclipse.viatra.solver.language.model.problem.VariableOrNodeArgument 19import org.eclipse.viatra.solver.language.model.problem.VariableOrNodeArgument
20import org.eclipse.viatra.solver.language.model.problem.UniqueDeclaration
20 21
21class ProblemTestUtil { 22class ProblemTestUtil {
22 def builtin(Problem it) { 23 def builtin(Problem it) {
@@ -91,6 +92,10 @@ class ProblemTestUtil {
91 nodes.findFirst[it.name == name] 92 nodes.findFirst[it.name == name]
92 } 93 }
93 94
95 def uniqueNode(Problem it, String name) {
96 statements.filter(UniqueDeclaration).flatMap[nodes].findFirst[it.name == name]
97 }
98
94 def findClass(Problem it, String name) { 99 def findClass(Problem it, String name) {
95 statements.filter(ClassDeclaration).findFirst[it.name == name] 100 statements.filter(ClassDeclaration).findFirst[it.name == name]
96 } 101 }
diff --git a/language/src/test/java/org/eclipse/viatra/solver/language/tests/scoping/NodeScopingTest.xtend b/language/src/test/java/org/eclipse/viatra/solver/language/tests/scoping/NodeScopingTest.xtend
index 5c34083c..db588e5d 100644
--- a/language/src/test/java/org/eclipse/viatra/solver/language/tests/scoping/NodeScopingTest.xtend
+++ b/language/src/test/java/org/eclipse/viatra/solver/language/tests/scoping/NodeScopingTest.xtend
@@ -42,7 +42,7 @@ class NodeScopingTest {
42 @Test 42 @Test
43 def void implicitNodeInAssertionTest() { 43 def void implicitNodeInAssertionTest() {
44 val it = parseHelper.parse(''' 44 val it = parseHelper.parse('''
45 pred predicate(node x, node y) <=> node(x). 45 pred predicate(node x, node y) <-> node(x).
46 predicate(a, a). 46 predicate(a, a).
47 ?predicate(a, b). 47 ?predicate(a, b).
48 ''') 48 ''')
@@ -64,9 +64,10 @@ class NodeScopingTest {
64 assertThat(nodeValueAssertion(0).node, equalTo(node('a'))) 64 assertThat(nodeValueAssertion(0).node, equalTo(node('a')))
65 } 65 }
66 66
67 @Test
67 def void implicitNodeInPredicateTest() { 68 def void implicitNodeInPredicateTest() {
68 val it = parseHelper.parse(''' 69 val it = parseHelper.parse('''
69 pred predicate(node a) <=> node(b). 70 pred predicate(node a) <-> node(b).
70 predicate(b). 71 predicate(b).
71 ''') 72 ''')
72 assertThat(errors, empty) 73 assertThat(errors, empty)
@@ -75,46 +76,63 @@ class NodeScopingTest {
75 assertThat(assertion(0).arg(0).node, equalTo(node("b"))) 76 assertThat(assertion(0).arg(0).node, equalTo(node("b")))
76 } 77 }
77 78
78 @Test 79 @ParameterizedTest
79 def void quotedNodeInAssertionTest() { 80 @MethodSource("uniqueNodeReferenceSource")
81 def void uniqueNodeInAssertionTest(String qualifiedNamePrefix, boolean namedProblem) {
80 val it = parseHelper.parse(''' 82 val it = parseHelper.parse('''
81 pred predicate(node x, node y) <=> node(x). 83 «IF namedProblem»problem test.«ENDIF»
82 predicate('a', 'a'). 84 unique a, b.
83 ?predicate('a', 'b'). 85 pred predicate(node x, node y) <-> node(x).
86 predicate(«qualifiedNamePrefix»a, «qualifiedNamePrefix»a).
87 ?predicate(«qualifiedNamePrefix»a, «qualifiedNamePrefix»b).
84 ''') 88 ''')
85 assertThat(errors, empty) 89 assertThat(errors, empty)
86 assertThat(nodeNames, hasItems("'a'", "'b'")) 90 assertThat(nodeNames, empty)
87 assertThat(assertion(0).arg(0).node, equalTo(node("'a'"))) 91 assertThat(assertion(0).arg(0).node, equalTo(uniqueNode('a')))
88 assertThat(assertion(0).arg(1).node, equalTo(node("'a'"))) 92 assertThat(assertion(0).arg(1).node, equalTo(uniqueNode('a')))
89 assertThat(assertion(1).arg(0).node, equalTo(node("'a'"))) 93 assertThat(assertion(1).arg(0).node, equalTo(uniqueNode('a')))
90 assertThat(assertion(1).arg(1).node, equalTo(node("'b'"))) 94 assertThat(assertion(1).arg(1).node, equalTo(uniqueNode('b')))
91 } 95 }
92 96
93 @Test 97 @ParameterizedTest
94 def void quotedNodeInNodeValueAssertionTest() { 98 @MethodSource("uniqueNodeReferenceSource")
99 def void uniqueNodeInNodeValueAssertionTest(String qualifiedNamePrefix, boolean namedProblem) {
95 val it = parseHelper.parse(''' 100 val it = parseHelper.parse('''
96 'a': 16. 101 «IF namedProblem»problem test.«ENDIF»
102 unique a.
103 «qualifiedNamePrefix»a: 16.
97 ''') 104 ''')
98 assertThat(errors, empty) 105 assertThat(errors, empty)
99 assertThat(nodeNames, hasItems("'a'")) 106 assertThat(nodeNames, empty)
100 assertThat(nodeValueAssertion(0).node, equalTo(node("'a'"))) 107 assertThat(nodeValueAssertion(0).node, equalTo(uniqueNode('a')))
101 } 108 }
102 109
103 @Test 110 @ParameterizedTest
104 def void quotedNodeInPredicateTest() { 111 @MethodSource("uniqueNodeReferenceSource")
112 def void uniqueNodeInPredicateTest(String qualifiedNamePrefix, boolean namedProblem) {
105 val it = parseHelper.parse(''' 113 val it = parseHelper.parse('''
106 pred predicate(node a) <=> node('b'). 114 «IF namedProblem»problem test.«ENDIF»
115 unique b.
116 pred predicate(node a) <-> node(«qualifiedNamePrefix»b).
107 ''') 117 ''')
108 assertThat(errors, empty) 118 assertThat(errors, empty)
109 assertThat(nodeNames, hasItem("'b'")) 119 assertThat(nodeNames, empty)
110 assertThat(pred("predicate").conj(0).lit(0).arg(0).node, equalTo(node("'b'"))) 120 assertThat(pred("predicate").conj(0).lit(0).arg(0).node, equalTo(uniqueNode("b")))
121 }
122
123 static def uniqueNodeReferenceSource() {
124 Stream.of(
125 Arguments.of("", false),
126 Arguments.of("", true),
127 Arguments.of("test::", true)
128 )
111 } 129 }
112 130
113 @ParameterizedTest 131 @ParameterizedTest
114 @MethodSource("builtInNodeReferencesSource") 132 @MethodSource("builtInNodeReferencesSource")
115 def void builtInNodeTest(String qualifiedName) { 133 def void builtInNodeTest(String qualifiedName) {
116 val it = parseHelper.parse(''' 134 val it = parseHelper.parse('''
117 pred predicate(node x) <=> node(x). 135 pred predicate(node x) <-> node(x).
118 predicate(«qualifiedName»). 136 predicate(«qualifiedName»).
119 ''') 137 ''')
120 assertThat(errors, empty) 138 assertThat(errors, empty)
@@ -137,7 +155,7 @@ class NodeScopingTest {
137 @MethodSource("builtInNodeReferencesSource") 155 @MethodSource("builtInNodeReferencesSource")
138 def void builtInNodeInPredicateTest(String qualifiedName) { 156 def void builtInNodeInPredicateTest(String qualifiedName) {
139 val it = parseHelper.parse(''' 157 val it = parseHelper.parse('''
140 pred predicate(node x) <=> node(«qualifiedName»). 158 pred predicate(node x) <-> node(«qualifiedName»).
141 ''') 159 ''')
142 assertThat(errors, empty) 160 assertThat(errors, empty)
143 assertThat(pred("predicate").conj(0).lit(0).arg(0).node, equalTo(builtin.findClass('int').newNode)) 161 assertThat(pred("predicate").conj(0).lit(0).arg(0).node, equalTo(builtin.findClass('int').newNode))
@@ -156,7 +174,7 @@ class NodeScopingTest {
156 val it = parseHelper.parse(''' 174 val it = parseHelper.parse('''
157 «IF namedProblem»problem test.«ENDIF» 175 «IF namedProblem»problem test.«ENDIF»
158 class Foo. 176 class Foo.
159 pred predicate(node x) <=> node(x). 177 pred predicate(node x) <-> node(x).
160 predicate(«qualifiedName»). 178 predicate(«qualifiedName»).
161 ''') 179 ''')
162 assertThat(errors, empty) 180 assertThat(errors, empty)
@@ -183,7 +201,7 @@ class NodeScopingTest {
183 val it = parseHelper.parse(''' 201 val it = parseHelper.parse('''
184 «IF namedProblem»problem test.«ENDIF» 202 «IF namedProblem»problem test.«ENDIF»
185 class Foo. 203 class Foo.
186 pred predicate(node x) <=> node(«qualifiedName»). 204 pred predicate(node x) <-> node(«qualifiedName»).
187 ''') 205 ''')
188 assertThat(errors, empty) 206 assertThat(errors, empty)
189 assertThat(pred("predicate").conj(0).lit(0).arg(0).node, equalTo(findClass('Foo').newNode)) 207 assertThat(pred("predicate").conj(0).lit(0).arg(0).node, equalTo(findClass('Foo').newNode))
@@ -201,7 +219,7 @@ class NodeScopingTest {
201 def void newNodeIsNotSpecial() { 219 def void newNodeIsNotSpecial() {
202 val it = parseHelper.parse(''' 220 val it = parseHelper.parse('''
203 class Foo. 221 class Foo.
204 pred predicate(node x) <=> node(x). 222 pred predicate(node x) <-> node(x).
205 predicate(new). 223 predicate(new).
206 ''') 224 ''')
207 assertThat(errors, empty) 225 assertThat(errors, empty)
@@ -215,7 +233,7 @@ class NodeScopingTest {
215 val it = parseHelper.parse(''' 233 val it = parseHelper.parse('''
216 «IF namedProblem»problem test.«ENDIF» 234 «IF namedProblem»problem test.«ENDIF»
217 enum Foo { alpha, beta } 235 enum Foo { alpha, beta }
218 pred predicate(Foo a) <=> node(a). 236 pred predicate(Foo a) <-> node(a).
219 predicate(«qualifiedName»). 237 predicate(«qualifiedName»).
220 ''') 238 ''')
221 assertThat(errors, empty) 239 assertThat(errors, empty)
@@ -242,7 +260,7 @@ class NodeScopingTest {
242 val it = parseHelper.parse(''' 260 val it = parseHelper.parse('''
243 «IF namedProblem»problem test.«ENDIF» 261 «IF namedProblem»problem test.«ENDIF»
244 enum Foo { alpha, beta } 262 enum Foo { alpha, beta }
245 pred predicate(Foo a) <=> node(«qualifiedName»). 263 pred predicate(Foo a) <-> node(«qualifiedName»).
246 ''') 264 ''')
247 assertThat(errors, empty) 265 assertThat(errors, empty)
248 assertThat(nodes, empty) 266 assertThat(nodes, empty)
@@ -264,7 +282,7 @@ class NodeScopingTest {
264 @MethodSource("builtInEnumLiteralReferencesSource") 282 @MethodSource("builtInEnumLiteralReferencesSource")
265 def void builtInEnumLiteralTest(String qualifiedName) { 283 def void builtInEnumLiteralTest(String qualifiedName) {
266 val it = parseHelper.parse(''' 284 val it = parseHelper.parse('''
267 pred predicate(node a) <=> node(a). 285 pred predicate(node a) <-> node(a).
268 predicate(«qualifiedName»). 286 predicate(«qualifiedName»).
269 ''') 287 ''')
270 assertThat(errors, empty) 288 assertThat(errors, empty)
@@ -287,7 +305,7 @@ class NodeScopingTest {
287 @MethodSource("builtInEnumLiteralReferencesSource") 305 @MethodSource("builtInEnumLiteralReferencesSource")
288 def void bultInEnumLiteralInPredicateTest(String qualifiedName) { 306 def void bultInEnumLiteralInPredicateTest(String qualifiedName) {
289 val it = parseHelper.parse(''' 307 val it = parseHelper.parse('''
290 pred predicate() <=> node(«qualifiedName»). 308 pred predicate() <-> node(«qualifiedName»).
291 ''') 309 ''')
292 assertThat(errors, empty) 310 assertThat(errors, empty)
293 assertThat(pred("predicate").conj(0).lit(0).arg(0).node, equalTo(builtin.findEnum("bool").literal("true"))) 311 assertThat(pred("predicate").conj(0).lit(0).arg(0).node, equalTo(builtin.findEnum("bool").literal("true")))