aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Garami Bence <85867500+garamibence@users.noreply.github.com>2021-10-13 20:59:35 +0200
committerLibravatar Garami Bence <85867500+garamibence@users.noreply.github.com>2021-10-20 21:12:33 +0200
commitb98bb0df11fb8bc9748247da004321ab94e954c5 (patch)
treeff128c03cfa0a1459de4e928f78f150484fdd269
parentAdd syntax for direct rules and direct predicates (diff)
downloadrefinery-b98bb0df11fb8bc9748247da004321ab94e954c5.tar.gz
refinery-b98bb0df11fb8bc9748247da004321ab94e954c5.tar.zst
refinery-b98bb0df11fb8bc9748247da004321ab94e954c5.zip
Add scope for new and delete with tests
-rw-r--r--language-model/problem.aird14
-rw-r--r--language-model/src/testFixtures/java/tools/refinery/language/model/tests/ProblemTestUtil.java47
-rw-r--r--language/src/main/java/tools/refinery/language/resource/DerivedVariableComputer.java18
-rw-r--r--language/src/main/java/tools/refinery/language/scoping/ProblemScopeProvider.java23
-rw-r--r--language/src/test/java/tools/refinery/language/tests/rules/DirectRuleParsingTest.xtend96
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;
7import org.eclipse.emf.ecore.util.EcoreUtil; 7import org.eclipse.emf.ecore.util.EcoreUtil;
8 8
9import tools.refinery.language.model.ProblemUtil; 9import tools.refinery.language.model.ProblemUtil;
10import tools.refinery.language.model.problem.ActionLiteral;
10import tools.refinery.language.model.problem.Argument; 11import tools.refinery.language.model.problem.Argument;
11import tools.refinery.language.model.problem.Assertion; 12import tools.refinery.language.model.problem.Assertion;
12import tools.refinery.language.model.problem.AssertionArgument; 13import tools.refinery.language.model.problem.AssertionArgument;
13import tools.refinery.language.model.problem.Atom; 14import tools.refinery.language.model.problem.Atom;
14import tools.refinery.language.model.problem.ClassDeclaration; 15import tools.refinery.language.model.problem.ClassDeclaration;
15import tools.refinery.language.model.problem.Conjunction; 16import tools.refinery.language.model.problem.Conjunction;
17import tools.refinery.language.model.problem.DeleteActionLiteral;
16import tools.refinery.language.model.problem.EnumDeclaration; 18import tools.refinery.language.model.problem.EnumDeclaration;
17import tools.refinery.language.model.problem.Literal; 19import tools.refinery.language.model.problem.Literal;
18import tools.refinery.language.model.problem.NamedElement; 20import tools.refinery.language.model.problem.NamedElement;
19import tools.refinery.language.model.problem.NegativeLiteral; 21import tools.refinery.language.model.problem.NegativeLiteral;
22import tools.refinery.language.model.problem.NewActionLiteral;
20import tools.refinery.language.model.problem.Node; 23import tools.refinery.language.model.problem.Node;
21import tools.refinery.language.model.problem.NodeAssertionArgument; 24import tools.refinery.language.model.problem.NodeAssertionArgument;
22import tools.refinery.language.model.problem.NodeValueAssertion; 25import tools.refinery.language.model.problem.NodeValueAssertion;
23import tools.refinery.language.model.problem.Parameter; 26import tools.refinery.language.model.problem.Parameter;
27import tools.refinery.language.model.problem.ParametricDefinition;
24import tools.refinery.language.model.problem.PredicateDefinition; 28import tools.refinery.language.model.problem.PredicateDefinition;
25import tools.refinery.language.model.problem.Problem; 29import tools.refinery.language.model.problem.Problem;
26import tools.refinery.language.model.problem.ReferenceDeclaration; 30import tools.refinery.language.model.problem.ReferenceDeclaration;
27import tools.refinery.language.model.problem.Relation; 31import tools.refinery.language.model.problem.Relation;
32import tools.refinery.language.model.problem.RuleDefinition;
28import tools.refinery.language.model.problem.Statement; 33import tools.refinery.language.model.problem.Statement;
29import tools.refinery.language.model.problem.UniqueDeclaration; 34import tools.refinery.language.model.problem.UniqueDeclaration;
35import tools.refinery.language.model.problem.ValueActionLiteral;
36import tools.refinery.language.model.problem.ValueLiteral;
30import tools.refinery.language.model.problem.Variable; 37import tools.refinery.language.model.problem.Variable;
31import tools.refinery.language.model.problem.VariableOrNode; 38import tools.refinery.language.model.problem.VariableOrNode;
32import tools.refinery.language.model.problem.VariableOrNodeArgument; 39import 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;
24import tools.refinery.language.model.problem.Literal; 24import tools.refinery.language.model.problem.Literal;
25import tools.refinery.language.model.problem.NegativeLiteral; 25import tools.refinery.language.model.problem.NegativeLiteral;
26import tools.refinery.language.model.problem.Parameter; 26import tools.refinery.language.model.problem.Parameter;
27import tools.refinery.language.model.problem.PredicateDefinition; 27import tools.refinery.language.model.problem.ParametricDefinition;
28import tools.refinery.language.model.problem.Problem; 28import tools.refinery.language.model.problem.Problem;
29import tools.refinery.language.model.problem.ProblemFactory; 29import tools.refinery.language.model.problem.ProblemFactory;
30import tools.refinery.language.model.problem.ProblemPackage; 30import tools.refinery.language.model.problem.ProblemPackage;
31import tools.refinery.language.model.problem.Statement; 31import tools.refinery.language.model.problem.Statement;
32import tools.refinery.language.model.problem.ValueLiteral;
32import tools.refinery.language.model.problem.VariableOrNodeArgument; 33import tools.refinery.language.model.problem.VariableOrNodeArgument;
33import tools.refinery.language.naming.NamingUtil; 34import 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;
15import tools.refinery.language.model.ProblemUtil; 15import tools.refinery.language.model.ProblemUtil;
16import tools.refinery.language.model.problem.ClassDeclaration; 16import tools.refinery.language.model.problem.ClassDeclaration;
17import tools.refinery.language.model.problem.ExistentialQuantifier; 17import tools.refinery.language.model.problem.ExistentialQuantifier;
18import tools.refinery.language.model.problem.PredicateDefinition; 18import tools.refinery.language.model.problem.NewActionLiteral;
19import tools.refinery.language.model.problem.ParametricDefinition;
20import tools.refinery.language.model.problem.Action;
19import tools.refinery.language.model.problem.Problem; 21import tools.refinery.language.model.problem.Problem;
20import tools.refinery.language.model.problem.ProblemPackage; 22import tools.refinery.language.model.problem.ProblemPackage;
21import tools.refinery.language.model.problem.ReferenceDeclaration; 23import 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 @@
1package tools.refinery.language.tests.rules
2
3import com.google.inject.Inject
4import org.eclipse.xtext.testing.InjectWith
5import org.eclipse.xtext.testing.extensions.InjectionExtension
6import org.eclipse.xtext.testing.util.ParseHelper
7import org.junit.jupiter.api.Test
8import org.junit.jupiter.api.^extension.ExtendWith
9import tools.refinery.language.model.problem.Problem
10import tools.refinery.language.tests.ProblemInjectorProvider
11import tools.refinery.language.model.tests.ProblemTestUtil
12
13import static org.hamcrest.MatcherAssert.assertThat
14import static org.hamcrest.Matchers.*
15
16@ExtendWith(InjectionExtension)
17@InjectWith(ProblemInjectorProvider)
18class 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}