diff options
5 files changed, 176 insertions, 22 deletions
diff --git a/language-model/problem.aird b/language-model/problem.aird index 52f96061..c5652fe4 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="317aa0da-1457-4006-8f53-eb42e5a6b580"> | 10 | <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_CsYa4KA4EeuqkpDnuik1sg" name="problem" repPath="#_CsUwgKA4EeuqkpDnuik1sg" changeId="120b195a-6ef2-4a18-9c1a-33913025087f"> |
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> |
@@ -765,8 +765,8 @@ | |||
765 | </children> | 765 | </children> |
766 | <styles xmi:type="notation:ConnectorStyle" xmi:id="_yCqSwaA7EeuqkpDnuik1sg" routing="Tree"/> | 766 | <styles xmi:type="notation:ConnectorStyle" xmi:id="_yCqSwaA7EeuqkpDnuik1sg" routing="Tree"/> |
767 | <styles xmi:type="notation:FontStyle" xmi:id="_yCqSwqA7EeuqkpDnuik1sg" fontName="Noto Sans" fontHeight="8"/> | 767 | <styles xmi:type="notation:FontStyle" xmi:id="_yCqSwqA7EeuqkpDnuik1sg" fontName="Noto Sans" fontHeight="8"/> |
768 | <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_yCqSw6A7EeuqkpDnuik1sg" points="[0, -5, -55, 683]$[0, -527, -55, 161]$[25, -527, -30, 161]$[25, -639, -30, 49]"/> | 768 | <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_yCqSw6A7EeuqkpDnuik1sg" points="[-1, -5, -56, 683]$[-1, -527, -56, 161]$[25, -527, -30, 161]$[25, -639, -30, 49]"/> |
769 | <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_yCqSyqA7EeuqkpDnuik1sg" id="(0.7711864406779662,0.05102040816326531)"/> | 769 | <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_yCqSyqA7EeuqkpDnuik1sg" id="(0.7288135593220338,0.030612244897959183)"/> |
770 | <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_yCqSy6A7EeuqkpDnuik1sg" id="(0.5,0.5)"/> | 770 | <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_yCqSy6A7EeuqkpDnuik1sg" id="(0.5,0.5)"/> |
771 | </edges> | 771 | </edges> |
772 | <edges xmi:type="notation:Edge" xmi:id="_0U2-4KA7EeuqkpDnuik1sg" type="4001" element="_0UtN5qA7EeuqkpDnuik1sg" source="_rRhWIKA7EeuqkpDnuik1sg" target="_-O-UEKA6EeuqkpDnuik1sg"> | 772 | <edges xmi:type="notation:Edge" xmi:id="_0U2-4KA7EeuqkpDnuik1sg" type="4001" element="_0UtN5qA7EeuqkpDnuik1sg" source="_rRhWIKA7EeuqkpDnuik1sg" target="_-O-UEKA6EeuqkpDnuik1sg"> |
@@ -1731,17 +1731,17 @@ | |||
1731 | </edges> | 1731 | </edges> |
1732 | <edges xmi:type="notation:Edge" xmi:id="_teMnUCrbEeyyC-O0_LlY9w" type="4001" element="_td_zEirbEeyyC-O0_LlY9w" source="_jjhjYCraEeyyC-O0_LlY9w" target="_q-1B4CrbEeyyC-O0_LlY9w"> | 1732 | <edges xmi:type="notation:Edge" xmi:id="_teMnUCrbEeyyC-O0_LlY9w" type="4001" element="_td_zEirbEeyyC-O0_LlY9w" source="_jjhjYCraEeyyC-O0_LlY9w" target="_q-1B4CrbEeyyC-O0_LlY9w"> |
1733 | <children xmi:type="notation:Node" xmi:id="_teNOYCrbEeyyC-O0_LlY9w" type="6001"> | 1733 | <children xmi:type="notation:Node" xmi:id="_teNOYCrbEeyyC-O0_LlY9w" type="6001"> |
1734 | <layoutConstraint xmi:type="notation:Bounds" xmi:id="_teNOYSrbEeyyC-O0_LlY9w" x="-218" y="-13"/> | 1734 | <layoutConstraint xmi:type="notation:Bounds" xmi:id="_teNOYSrbEeyyC-O0_LlY9w" x="-226" y="-13"/> |
1735 | </children> | 1735 | </children> |
1736 | <children xmi:type="notation:Node" xmi:id="_teN1cCrbEeyyC-O0_LlY9w" type="6002"> | 1736 | <children xmi:type="notation:Node" xmi:id="_teN1cCrbEeyyC-O0_LlY9w" type="6002"> |
1737 | <layoutConstraint xmi:type="notation:Bounds" xmi:id="_teN1cSrbEeyyC-O0_LlY9w" x="98" y="10"/> | 1737 | <layoutConstraint xmi:type="notation:Bounds" xmi:id="_teN1cSrbEeyyC-O0_LlY9w" x="84" y="10"/> |
1738 | </children> | 1738 | </children> |
1739 | <children xmi:type="notation:Node" xmi:id="_teOcgCrbEeyyC-O0_LlY9w" type="6003"> | 1739 | <children xmi:type="notation:Node" xmi:id="_teOcgCrbEeyyC-O0_LlY9w" type="6003"> |
1740 | <layoutConstraint xmi:type="notation:Bounds" xmi:id="_teOcgSrbEeyyC-O0_LlY9w" x="16"/> | 1740 | <layoutConstraint xmi:type="notation:Bounds" xmi:id="_teOcgSrbEeyyC-O0_LlY9w" x="13"/> |
1741 | </children> | 1741 | </children> |
1742 | <styles xmi:type="notation:ConnectorStyle" xmi:id="_teMnUSrbEeyyC-O0_LlY9w" routing="Rectilinear"/> | 1742 | <styles xmi:type="notation:ConnectorStyle" xmi:id="_teMnUSrbEeyyC-O0_LlY9w" routing="Rectilinear"/> |
1743 | <styles xmi:type="notation:FontStyle" xmi:id="_teMnUirbEeyyC-O0_LlY9w" fontColor="7490599" fontName="Segoe UI" fontHeight="8"/> | 1743 | <styles xmi:type="notation:FontStyle" xmi:id="_teMnUirbEeyyC-O0_LlY9w" fontColor="7490599" fontName="Segoe UI" fontHeight="8"/> |
1744 | <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_teMnUyrbEeyyC-O0_LlY9w" points="[-58, 49, -398, -220]$[-58, 83, -398, -186]$[397, 83, 57, -186]$[397, 250, 57, -19]"/> | 1744 | <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_teMnUyrbEeyyC-O0_LlY9w" points="[-42, 49, -382, -220]$[-42, 83, -382, -186]$[397, 83, 57, -186]$[397, 250, 57, -19]"/> |
1745 | <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_teOcgirbEeyyC-O0_LlY9w" id="(1.0,0.5)"/> | 1745 | <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_teOcgirbEeyyC-O0_LlY9w" id="(1.0,0.5)"/> |
1746 | <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_teOcgyrbEeyyC-O0_LlY9w" id="(0.0,0.19387755102040816)"/> | 1746 | <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_teOcgyrbEeyyC-O0_LlY9w" id="(0.0,0.19387755102040816)"/> |
1747 | </edges> | 1747 | </edges> |
diff --git a/language-model/src/testFixtures/java/tools/refinery/language/model/tests/ProblemTestUtil.java b/language-model/src/testFixtures/java/tools/refinery/language/model/tests/ProblemTestUtil.java index b412ed1f..dadc5330 100644 --- a/language-model/src/testFixtures/java/tools/refinery/language/model/tests/ProblemTestUtil.java +++ b/language-model/src/testFixtures/java/tools/refinery/language/model/tests/ProblemTestUtil.java | |||
@@ -7,26 +7,33 @@ import org.eclipse.emf.ecore.resource.Resource.Diagnostic; | |||
7 | import org.eclipse.emf.ecore.util.EcoreUtil; | 7 | import org.eclipse.emf.ecore.util.EcoreUtil; |
8 | 8 | ||
9 | import tools.refinery.language.model.ProblemUtil; | 9 | import tools.refinery.language.model.ProblemUtil; |
10 | import tools.refinery.language.model.problem.ActionLiteral; | ||
10 | import tools.refinery.language.model.problem.Argument; | 11 | import tools.refinery.language.model.problem.Argument; |
11 | import tools.refinery.language.model.problem.Assertion; | 12 | import tools.refinery.language.model.problem.Assertion; |
12 | import tools.refinery.language.model.problem.AssertionArgument; | 13 | import tools.refinery.language.model.problem.AssertionArgument; |
13 | import tools.refinery.language.model.problem.Atom; | 14 | import tools.refinery.language.model.problem.Atom; |
14 | import tools.refinery.language.model.problem.ClassDeclaration; | 15 | import tools.refinery.language.model.problem.ClassDeclaration; |
15 | import tools.refinery.language.model.problem.Conjunction; | 16 | import tools.refinery.language.model.problem.Conjunction; |
17 | import tools.refinery.language.model.problem.DeleteActionLiteral; | ||
16 | import tools.refinery.language.model.problem.EnumDeclaration; | 18 | import tools.refinery.language.model.problem.EnumDeclaration; |
17 | import tools.refinery.language.model.problem.Literal; | 19 | import tools.refinery.language.model.problem.Literal; |
18 | import tools.refinery.language.model.problem.NamedElement; | 20 | import tools.refinery.language.model.problem.NamedElement; |
19 | import tools.refinery.language.model.problem.NegativeLiteral; | 21 | import tools.refinery.language.model.problem.NegativeLiteral; |
22 | import tools.refinery.language.model.problem.NewActionLiteral; | ||
20 | import tools.refinery.language.model.problem.Node; | 23 | import tools.refinery.language.model.problem.Node; |
21 | import tools.refinery.language.model.problem.NodeAssertionArgument; | 24 | import tools.refinery.language.model.problem.NodeAssertionArgument; |
22 | import tools.refinery.language.model.problem.NodeValueAssertion; | 25 | import tools.refinery.language.model.problem.NodeValueAssertion; |
23 | import tools.refinery.language.model.problem.Parameter; | 26 | import tools.refinery.language.model.problem.Parameter; |
27 | import tools.refinery.language.model.problem.ParametricDefinition; | ||
24 | import tools.refinery.language.model.problem.PredicateDefinition; | 28 | import tools.refinery.language.model.problem.PredicateDefinition; |
25 | import tools.refinery.language.model.problem.Problem; | 29 | import tools.refinery.language.model.problem.Problem; |
26 | import tools.refinery.language.model.problem.ReferenceDeclaration; | 30 | import tools.refinery.language.model.problem.ReferenceDeclaration; |
27 | import tools.refinery.language.model.problem.Relation; | 31 | import tools.refinery.language.model.problem.Relation; |
32 | import tools.refinery.language.model.problem.RuleDefinition; | ||
28 | import tools.refinery.language.model.problem.Statement; | 33 | import tools.refinery.language.model.problem.Statement; |
29 | import tools.refinery.language.model.problem.UniqueDeclaration; | 34 | import tools.refinery.language.model.problem.UniqueDeclaration; |
35 | import tools.refinery.language.model.problem.ValueActionLiteral; | ||
36 | import tools.refinery.language.model.problem.ValueLiteral; | ||
30 | import tools.refinery.language.model.problem.Variable; | 37 | import tools.refinery.language.model.problem.Variable; |
31 | import tools.refinery.language.model.problem.VariableOrNode; | 38 | import tools.refinery.language.model.problem.VariableOrNode; |
32 | import tools.refinery.language.model.problem.VariableOrNodeArgument; | 39 | import tools.refinery.language.model.problem.VariableOrNodeArgument; |
@@ -49,17 +56,29 @@ public class ProblemTestUtil { | |||
49 | return namedStatementOfType(problem, PredicateDefinition.class, name); | 56 | return namedStatementOfType(problem, PredicateDefinition.class, name); |
50 | } | 57 | } |
51 | 58 | ||
52 | public Parameter param(PredicateDefinition definition, int i) { | 59 | public RuleDefinition rule(Problem problem, String name) { |
60 | return namedStatementOfType(problem, RuleDefinition.class, name); | ||
61 | } | ||
62 | |||
63 | public Parameter param(ParametricDefinition definition, int i) { | ||
53 | return definition.getParameters().get(i); | 64 | return definition.getParameters().get(i); |
54 | } | 65 | } |
55 | 66 | ||
56 | public Conjunction conj(PredicateDefinition definition, int i) { | 67 | public Conjunction conj(ParametricDefinition definition, int i) { |
57 | return definition.getBodies().get(i); | 68 | return definition.getBodies().get(i); |
58 | } | 69 | } |
59 | 70 | ||
60 | public Literal lit(Conjunction conjunction, int i) { | 71 | public Literal lit(Conjunction conjunction, int i) { |
61 | return conjunction.getLiterals().get(i); | 72 | return conjunction.getLiterals().get(i); |
62 | } | 73 | } |
74 | |||
75 | public ActionLiteral actionLit(RuleDefinition rule, int i) { | ||
76 | return rule.getAction().getActionLiterals().get(i); | ||
77 | } | ||
78 | |||
79 | public Atom valueAtom(Literal literal) { | ||
80 | return ((ValueLiteral) literal).getAtom(); | ||
81 | } | ||
63 | 82 | ||
64 | public Atom negated(Literal literal) { | 83 | public Atom negated(Literal literal) { |
65 | return ((NegativeLiteral) literal).getAtom(); | 84 | return ((NegativeLiteral) literal).getAtom(); |
@@ -85,6 +104,30 @@ public class ProblemTestUtil { | |||
85 | return (Variable) variableOrNode(argument); | 104 | return (Variable) variableOrNode(argument); |
86 | } | 105 | } |
87 | 106 | ||
107 | public Variable variable(ValueActionLiteral valueActionLiteral, int i) { | ||
108 | return variable(arg(valueActionLiteral.getAtom(), i)); | ||
109 | } | ||
110 | |||
111 | public Variable variable(NewActionLiteral newActionLiteral) { | ||
112 | return newActionLiteral.getVariable(); | ||
113 | } | ||
114 | |||
115 | public VariableOrNode deleteVar(ActionLiteral actionLiteral) { | ||
116 | return ((DeleteActionLiteral) actionLiteral).getVariableOrNode(); | ||
117 | } | ||
118 | |||
119 | public VariableOrNode newVar(ActionLiteral actionLiteral) { | ||
120 | return ((NewActionLiteral) actionLiteral).getVariable(); | ||
121 | } | ||
122 | |||
123 | public Atom valueAtom(ActionLiteral actionLiteral) { | ||
124 | return ((ValueActionLiteral) actionLiteral).getAtom(); | ||
125 | } | ||
126 | |||
127 | public Variable variable(DeleteActionLiteral deleteActionLiteral) { | ||
128 | return (Variable) deleteActionLiteral.getVariableOrNode(); | ||
129 | } | ||
130 | |||
88 | public Node node(Argument argument) { | 131 | public Node node(Argument argument) { |
89 | return (Node) variableOrNode(argument); | 132 | return (Node) variableOrNode(argument); |
90 | } | 133 | } |
diff --git a/language/src/main/java/tools/refinery/language/resource/DerivedVariableComputer.java b/language/src/main/java/tools/refinery/language/resource/DerivedVariableComputer.java index 2061c30e..bb1226c4 100644 --- a/language/src/main/java/tools/refinery/language/resource/DerivedVariableComputer.java +++ b/language/src/main/java/tools/refinery/language/resource/DerivedVariableComputer.java | |||
@@ -24,11 +24,12 @@ import tools.refinery.language.model.problem.ImplicitVariable; | |||
24 | import tools.refinery.language.model.problem.Literal; | 24 | import tools.refinery.language.model.problem.Literal; |
25 | import tools.refinery.language.model.problem.NegativeLiteral; | 25 | import tools.refinery.language.model.problem.NegativeLiteral; |
26 | import tools.refinery.language.model.problem.Parameter; | 26 | import tools.refinery.language.model.problem.Parameter; |
27 | import tools.refinery.language.model.problem.PredicateDefinition; | 27 | import tools.refinery.language.model.problem.ParametricDefinition; |
28 | import tools.refinery.language.model.problem.Problem; | 28 | import tools.refinery.language.model.problem.Problem; |
29 | import tools.refinery.language.model.problem.ProblemFactory; | 29 | import tools.refinery.language.model.problem.ProblemFactory; |
30 | import tools.refinery.language.model.problem.ProblemPackage; | 30 | import tools.refinery.language.model.problem.ProblemPackage; |
31 | import tools.refinery.language.model.problem.Statement; | 31 | import tools.refinery.language.model.problem.Statement; |
32 | import tools.refinery.language.model.problem.ValueLiteral; | ||
32 | import tools.refinery.language.model.problem.VariableOrNodeArgument; | 33 | import tools.refinery.language.model.problem.VariableOrNodeArgument; |
33 | import tools.refinery.language.naming.NamingUtil; | 34 | import tools.refinery.language.naming.NamingUtil; |
34 | 35 | ||
@@ -46,13 +47,13 @@ public class DerivedVariableComputer { | |||
46 | 47 | ||
47 | public void installDerivedVariables(Problem problem, Set<String> nodeNames) { | 48 | public void installDerivedVariables(Problem problem, Set<String> nodeNames) { |
48 | for (Statement statement : problem.getStatements()) { | 49 | for (Statement statement : problem.getStatements()) { |
49 | if (statement instanceof PredicateDefinition definition) { | 50 | if (statement instanceof ParametricDefinition definition) { |
50 | installDerivedPredicateDefinitionState(definition, nodeNames); | 51 | installDerivedParametricDefinitionState(definition, nodeNames); |
51 | } | 52 | } |
52 | } | 53 | } |
53 | } | 54 | } |
54 | 55 | ||
55 | protected void installDerivedPredicateDefinitionState(PredicateDefinition definition, Set<String> nodeNames) { | 56 | protected void installDerivedParametricDefinitionState(ParametricDefinition definition, Set<String> nodeNames) { |
56 | Set<String> knownVariables = new HashSet<>(); | 57 | Set<String> knownVariables = new HashSet<>(); |
57 | knownVariables.addAll(nodeNames); | 58 | knownVariables.addAll(nodeNames); |
58 | for (Parameter parameter : definition.getParameters()) { | 59 | for (Parameter parameter : definition.getParameters()) { |
@@ -71,6 +72,9 @@ public class DerivedVariableComputer { | |||
71 | for (Literal literal : conjunction.getLiterals()) { | 72 | for (Literal literal : conjunction.getLiterals()) { |
72 | if (literal instanceof Atom atom) { | 73 | if (literal instanceof Atom atom) { |
73 | createSigletonVariablesAndCollectVariables(atom, knownVariables, newVariables); | 74 | createSigletonVariablesAndCollectVariables(atom, knownVariables, newVariables); |
75 | } else | ||
76 | if (literal instanceof ValueLiteral valueLiteral) { | ||
77 | createSigletonVariablesAndCollectVariables(valueLiteral.getAtom(), knownVariables, newVariables); | ||
74 | } | 78 | } |
75 | } | 79 | } |
76 | createVariables(conjunction, newVariables); | 80 | createVariables(conjunction, newVariables); |
@@ -156,13 +160,13 @@ public class DerivedVariableComputer { | |||
156 | 160 | ||
157 | public void discardDerivedVariables(Problem problem) { | 161 | public void discardDerivedVariables(Problem problem) { |
158 | for (Statement statement : problem.getStatements()) { | 162 | for (Statement statement : problem.getStatements()) { |
159 | if (statement instanceof PredicateDefinition predicateDefinition) { | 163 | if (statement instanceof ParametricDefinition parametricDefinition) { |
160 | discardPredicateDefinitionState(predicateDefinition); | 164 | discardParametricDefinitionState(parametricDefinition); |
161 | } | 165 | } |
162 | } | 166 | } |
163 | } | 167 | } |
164 | 168 | ||
165 | protected void discardPredicateDefinitionState(PredicateDefinition definition) { | 169 | protected void discardParametricDefinitionState(ParametricDefinition definition) { |
166 | for (Conjunction body : definition.getBodies()) { | 170 | for (Conjunction body : definition.getBodies()) { |
167 | body.getImplicitVariables().clear(); | 171 | body.getImplicitVariables().clear(); |
168 | for (Literal literal : body.getLiterals()) { | 172 | for (Literal literal : body.getLiterals()) { |
diff --git a/language/src/main/java/tools/refinery/language/scoping/ProblemScopeProvider.java b/language/src/main/java/tools/refinery/language/scoping/ProblemScopeProvider.java index 86b39dbc..d31a5308 100644 --- a/language/src/main/java/tools/refinery/language/scoping/ProblemScopeProvider.java +++ b/language/src/main/java/tools/refinery/language/scoping/ProblemScopeProvider.java | |||
@@ -15,7 +15,9 @@ import org.eclipse.xtext.scoping.Scopes; | |||
15 | import tools.refinery.language.model.ProblemUtil; | 15 | import tools.refinery.language.model.ProblemUtil; |
16 | import tools.refinery.language.model.problem.ClassDeclaration; | 16 | import tools.refinery.language.model.problem.ClassDeclaration; |
17 | import tools.refinery.language.model.problem.ExistentialQuantifier; | 17 | import tools.refinery.language.model.problem.ExistentialQuantifier; |
18 | import tools.refinery.language.model.problem.PredicateDefinition; | 18 | import tools.refinery.language.model.problem.NewActionLiteral; |
19 | import tools.refinery.language.model.problem.ParametricDefinition; | ||
20 | import tools.refinery.language.model.problem.Action; | ||
19 | import tools.refinery.language.model.problem.Problem; | 21 | import tools.refinery.language.model.problem.Problem; |
20 | import tools.refinery.language.model.problem.ProblemPackage; | 22 | import tools.refinery.language.model.problem.ProblemPackage; |
21 | import tools.refinery.language.model.problem.ReferenceDeclaration; | 23 | import tools.refinery.language.model.problem.ReferenceDeclaration; |
@@ -38,7 +40,8 @@ public class ProblemScopeProvider extends AbstractProblemScopeProvider { | |||
38 | || reference == ProblemPackage.Literals.NODE_VALUE_ASSERTION__NODE) { | 40 | || reference == ProblemPackage.Literals.NODE_VALUE_ASSERTION__NODE) { |
39 | return getNodesScope(context, scope); | 41 | return getNodesScope(context, scope); |
40 | } | 42 | } |
41 | if (reference == ProblemPackage.Literals.VARIABLE_OR_NODE_ARGUMENT__VARIABLE_OR_NODE) { | 43 | if (reference == ProblemPackage.Literals.VARIABLE_OR_NODE_ARGUMENT__VARIABLE_OR_NODE |
44 | || reference == ProblemPackage.Literals.DELETE_ACTION_LITERAL__VARIABLE_OR_NODE) { | ||
42 | return getVariableScope(context, scope); | 45 | return getVariableScope(context, scope); |
43 | } | 46 | } |
44 | if (reference == ProblemPackage.Literals.REFERENCE_DECLARATION__OPPOSITE) { | 47 | if (reference == ProblemPackage.Literals.REFERENCE_DECLARATION__OPPOSITE) { |
@@ -64,17 +67,25 @@ public class ProblemScopeProvider extends AbstractProblemScopeProvider { | |||
64 | variables.add(singletonVariable); | 67 | variables.add(singletonVariable); |
65 | } | 68 | } |
66 | } | 69 | } |
67 | while (currentContext != null && !(currentContext instanceof PredicateDefinition)) { | 70 | while (currentContext != null && !(currentContext instanceof ParametricDefinition)) { |
68 | if (currentContext instanceof ExistentialQuantifier quantifier) { | 71 | if (currentContext instanceof ExistentialQuantifier quantifier) { |
69 | variables.addAll(quantifier.getImplicitVariables()); | 72 | variables.addAll(quantifier.getImplicitVariables()); |
73 | } else | ||
74 | if(currentContext instanceof Action action) { | ||
75 | for (var literal : action.getActionLiterals()) { | ||
76 | if(literal instanceof NewActionLiteral newActionLiteral && newActionLiteral.getVariable() != null) { | ||
77 | variables.add(newActionLiteral.getVariable()); | ||
78 | } | ||
79 | } | ||
70 | } | 80 | } |
71 | currentContext = currentContext.eContainer(); | 81 | currentContext = currentContext.eContainer(); |
72 | } | 82 | } |
83 | IScope parentScope = getNodesScope(context, delegateScope); | ||
73 | if (currentContext != null) { | 84 | if (currentContext != null) { |
74 | PredicateDefinition definition = (PredicateDefinition) currentContext; | 85 | ParametricDefinition definition = (ParametricDefinition) currentContext; |
75 | variables.addAll(definition.getParameters()); | 86 | parentScope = Scopes.scopeFor(definition.getParameters(),parentScope); |
76 | } | 87 | } |
77 | return Scopes.scopeFor(variables, getNodesScope(context, delegateScope)); | 88 | return Scopes.scopeFor(variables,parentScope); |
78 | } | 89 | } |
79 | 90 | ||
80 | protected IScope getOppositeScope(EObject context, IScope delegateScope) { | 91 | protected IScope getOppositeScope(EObject context, IScope delegateScope) { |
diff --git a/language/src/test/java/tools/refinery/language/tests/rules/DirectRuleParsingTest.xtend b/language/src/test/java/tools/refinery/language/tests/rules/DirectRuleParsingTest.xtend new file mode 100644 index 00000000..d60651a0 --- /dev/null +++ b/language/src/test/java/tools/refinery/language/tests/rules/DirectRuleParsingTest.xtend | |||
@@ -0,0 +1,96 @@ | |||
1 | package tools.refinery.language.tests.rules | ||
2 | |||
3 | import com.google.inject.Inject | ||
4 | import org.eclipse.xtext.testing.InjectWith | ||
5 | import org.eclipse.xtext.testing.extensions.InjectionExtension | ||
6 | import org.eclipse.xtext.testing.util.ParseHelper | ||
7 | import org.junit.jupiter.api.Test | ||
8 | import org.junit.jupiter.api.^extension.ExtendWith | ||
9 | import tools.refinery.language.model.problem.Problem | ||
10 | import tools.refinery.language.tests.ProblemInjectorProvider | ||
11 | import tools.refinery.language.model.tests.ProblemTestUtil | ||
12 | |||
13 | import static org.hamcrest.MatcherAssert.assertThat | ||
14 | import static org.hamcrest.Matchers.* | ||
15 | |||
16 | @ExtendWith(InjectionExtension) | ||
17 | @InjectWith(ProblemInjectorProvider) | ||
18 | class DirectRuleParsingTest { | ||
19 | @Inject | ||
20 | ParseHelper<Problem> parseHelper | ||
21 | |||
22 | @Inject | ||
23 | extension ProblemTestUtil | ||
24 | |||
25 | @Test | ||
26 | def void relationValueRewriteTest() { | ||
27 | val it = parseHelper.parse(''' | ||
28 | pred Person(p). | ||
29 | direct rule r(p1): Person(p1) = true ~> Person(p1) = false. | ||
30 | ''') | ||
31 | assertThat(errors, empty) | ||
32 | } | ||
33 | |||
34 | @Test | ||
35 | def void relationValueMergeTest() { | ||
36 | val it = parseHelper.parse(''' | ||
37 | pred Person(p). | ||
38 | direct rule r(p1): Person(p1): true ~> Person(p1): false. | ||
39 | ''') | ||
40 | assertThat(errors, empty) | ||
41 | } | ||
42 | |||
43 | @Test | ||
44 | def void newNodeTest() { | ||
45 | val it = parseHelper.parse(''' | ||
46 | pred Person(p). | ||
47 | direct rule r(p1): Person(p1) = true ~> new p2, Person(p2) = unknown. | ||
48 | ''') | ||
49 | assertThat(errors, empty) | ||
50 | assertThat(rule("r").param(0), equalTo(rule("r").conj(0).lit(0).valueAtom.arg(0).variable)) | ||
51 | assertThat(rule("r").actionLit(0).newVar, | ||
52 | equalTo(rule("r").actionLit(1).valueAtom.arg(0).variable) | ||
53 | ) | ||
54 | } | ||
55 | |||
56 | @Test | ||
57 | def void differentScopeTest() { | ||
58 | val it = parseHelper.parse(''' | ||
59 | pred Friend(a, b). | ||
60 | direct rule r(p1): Friend(p1, p2) = false ~> new p2, Friend(p1, p2) = true. | ||
61 | ''') | ||
62 | assertThat(errors, empty) | ||
63 | assertThat(rule("r").conj(0).lit(0).valueAtom.arg(1).variable, | ||
64 | not(equalTo(rule("r").actionLit(1).valueAtom.arg(1).variable))) | ||
65 | } | ||
66 | |||
67 | @Test | ||
68 | def void parameterShadowingTest() { | ||
69 | val it = parseHelper.parse(''' | ||
70 | pred Friend(a, b). | ||
71 | direct rule r(p1, p2): Friend(p1, p2) = false ~> new p2, Friend(p1, p2) = true. | ||
72 | ''') | ||
73 | assertThat(errors, empty) | ||
74 | assertThat(rule("r").param(1), | ||
75 | not(equalTo(rule("r").actionLit(1).valueAtom.arg(1).variable))) | ||
76 | } | ||
77 | |||
78 | @Test | ||
79 | def void deleteParameterNodeTest() { | ||
80 | val it = parseHelper.parse(''' | ||
81 | pred Person(p). | ||
82 | direct rule r(p1): Person(p1): false ~> delete p1. | ||
83 | ''') | ||
84 | assertThat(errors, empty) | ||
85 | } | ||
86 | |||
87 | @Test | ||
88 | def void deleteDifferentScopeNodeTest() { | ||
89 | val it = parseHelper.parse(''' | ||
90 | pred Friend(p). | ||
91 | direct rule r(p1): Friend(p1, p2) = true ~> delete p2. | ||
92 | ''') | ||
93 | assertThat(errors, not(empty)) | ||
94 | } | ||
95 | |||
96 | } | ||